/ Hex Artifact Content
Login

Artifact a84c848ee737354441ab443ccc50710e34dcac62:


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 36 38 20 32 30 30 37 2f 30  c,v 1.368 2007/0
0190: 35 2f 30 32 20 31 37 3a 35 34 3a 35 36 20 64 72  5/02 17:54:56 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 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
3b40: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 38 20  enabled */.  u8 
3b50: 69 6e 63 72 56 61 63 75 75 6d 3b 20 20 20 20 20  incrVacuum;     
3b60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
3b70: 63 72 2d 76 61 63 75 75 6d 20 69 73 20 65 6e 61  cr-vacuum is ena
3b80: 62 6c 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  bled */.  Pgno n
3b90: 54 72 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  Trunc;          
3ba0: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  /* Non-zero if t
3bb0: 68 65 20 64 62 20 77 69 6c 6c 20 62 65 20 74 72  he db will be tr
3bc0: 75 6e 63 61 74 65 64 20 28 69 6e 63 72 20 76 61  uncated (incr va
3bd0: 63 75 75 6d 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  cuum) */.#endif.
3be0: 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 3b 20    u16 pageSize; 
3bf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3c00: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
3c10: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
3c20: 75 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  u16 usableSize; 
3c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3c40: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
3c50: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
3c60: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
3c70: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3c80: 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  um local payload
3c90: 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44 41 54 41   in non-LEAFDATA
3ca0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74   tables */.  int
3cb0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20   minLocal;      
3cc0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f     /* Minimum lo
3cd0: 63 61 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e  cal payload in n
3ce0: 6f 6e 2d 4c 45 41 46 44 41 54 41 20 74 61 62 6c  on-LEAFDATA tabl
3cf0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c  es */.  int maxL
3d00: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf;          /*
3d10: 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61 6c 20 70   Maximum local p
3d20: 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41 46  ayload in a LEAF
3d30: 44 41 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20  DATA table */.  
3d40: 69 6e 74 20 6d 69 6e 4c 65 61 66 3b 20 20 20 20  int minLeaf;    
3d50: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3d60: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3d70: 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 61 62  n a LEAFDATA tab
3d80: 6c 65 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64  le */.  BusyHand
3d90: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
3da0: 72 3b 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  r;   /* Callback
3db0: 20 66 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20   for when there 
3dc0: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
3dd0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 6e 54 72 61  on */.  u8 inTra
3de0: 6e 73 61 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a  nsaction;     /*
3df0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   Transaction sta
3e00: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  te */.  int nRef
3e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3e20: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
3e30: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 73 74  ences to this st
3e40: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
3e50: 20 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 20 20   nTransaction;  
3e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3e70: 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
3e80: 73 20 28 72 65 61 64 20 2b 20 77 72 69 74 65 29  s (read + write)
3e90: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 53 63 68   */.  void *pSch
3ea0: 65 6d 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  ema;        /* P
3eb0: 6f 69 6e 74 65 72 20 74 6f 20 73 70 61 63 65 20  ointer to space 
3ec0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73 71 6c  allocated by sql
3ed0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
3ee0: 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46  ) */.  void (*xF
3ef0: 72 65 65 53 63 68 65 6d 61 29 28 76 6f 69 64 2a  reeSchema)(void*
3f00: 29 3b 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f  );  /* Destructo
3f10: 72 20 66 6f 72 20 42 74 53 68 61 72 65 64 2e 70  r for BtShared.p
3f20: 53 63 68 65 6d 61 20 2a 2f 0a 23 69 66 6e 64 65  Schema */.#ifnde
3f30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3f40: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 42 74 4c  ARED_CACHE.  BtL
3f50: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 20 20 20 20 20  ock *pLock;     
3f60: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6c 6f     /* List of lo
3f70: 63 6b 73 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  cks held on this
3f80: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
3f90: 72 75 63 74 20 2a 2f 0a 20 20 42 74 53 68 61 72  ruct */.  BtShar
3fa0: 65 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  ed *pNext;      
3fb0: 2f 2a 20 4e 65 78 74 20 69 6e 20 54 68 72 65 61  /* Next in Threa
3fc0: 64 44 61 74 61 2e 70 42 74 72 65 65 20 6c 69 6e  dData.pBtree lin
3fd0: 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 23 65 6e 64  ked list */.#end
3fe0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
3ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
4000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
4010: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 68  ure is used to h
4020: 6f 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  old information.
4030: 2a 2a 20 61 62 6f 75 74 20 61 20 63 65 6c 6c 2e  ** about a cell.
4040: 20 20 54 68 65 20 70 61 72 73 65 43 65 6c 6c 50    The parseCellP
4050: 74 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 69  tr() function fi
4060: 6c 6c 73 20 69 6e 20 74 68 69 73 20 73 74 72 75  lls in this stru
4070: 63 74 75 72 65 0a 2a 2a 20 62 61 73 65 64 20 6f  cture.** based o
4080: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 65 78  n information ex
4090: 74 72 61 63 74 20 66 72 6f 6d 20 74 68 65 20 72  tract from the r
40a0: 61 77 20 64 69 73 6b 20 70 61 67 65 2e 0a 2a 2f  aw disk page..*/
40b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
40c0: 43 65 6c 6c 49 6e 66 6f 20 43 65 6c 6c 49 6e 66  CellInfo CellInf
40d0: 6f 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 49 6e  o;.struct CellIn
40e0: 66 6f 20 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  fo {.  u8 *pCell
40f0: 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
4100: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
4110: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
4120: 0a 20 20 69 36 34 20 6e 4b 65 79 3b 20 20 20 20  .  i64 nKey;    
4130: 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 66 6f 72    /* The key for
4140: 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
4150: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  or number of byt
4160: 65 73 20 69 6e 20 6b 65 79 20 2a 2f 0a 20 20 75  es in key */.  u
4170: 33 32 20 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a  32 nData;     /*
4180: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
4190: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 75 33   of data */.  u3
41a0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 2f 2a 20  2 nPayload;  /* 
41b0: 54 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20  Total amount of 
41c0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 31 36  payload */.  u16
41d0: 20 6e 48 65 61 64 65 72 3b 20 20 20 2f 2a 20 53   nHeader;   /* S
41e0: 69 7a 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ize of the cell 
41f0: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 69  content header i
4200: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 31 36  n bytes */.  u16
4210: 20 6e 4c 6f 63 61 6c 3b 20 20 20 20 2f 2a 20 41   nLocal;    /* A
4220: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
4230: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
4240: 0a 20 20 75 31 36 20 69 4f 76 65 72 66 6c 6f 77  .  u16 iOverflow
4250: 3b 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 6f  ; /* Offset to o
4260: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
4270: 62 65 72 2e 20 20 5a 65 72 6f 20 69 66 20 6e 6f  ber.  Zero if no
4280: 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 75   overflow */.  u
4290: 31 36 20 6e 53 69 7a 65 3b 20 20 20 20 20 2f 2a  16 nSize;     /*
42a0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63 65 6c   Size of the cel
42b0: 6c 20 63 6f 6e 74 65 6e 74 20 6f 6e 20 74 68 65  l content on the
42c0: 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
42d0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
42e0: 20 63 75 72 73 6f 72 20 69 73 20 61 20 70 6f 69   cursor is a poi
42f0: 6e 74 65 72 20 74 6f 20 61 20 70 61 72 74 69 63  nter to a partic
4300: 75 6c 61 72 20 65 6e 74 72 79 20 69 6e 20 74 68  ular entry in th
4310: 65 20 42 54 72 65 65 2e 0a 2a 2a 20 54 68 65 20  e BTree..** The 
4320: 65 6e 74 72 79 20 69 73 20 69 64 65 6e 74 69 66  entry is identif
4330: 69 65 64 20 62 79 20 69 74 73 20 4d 65 6d 50 61  ied by its MemPa
4340: 67 65 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ge and the index
4350: 20 69 6e 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61   in.** MemPage.a
4360: 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 65 6e  Cell[] of the en
4370: 74 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42  try..*/.struct B
4380: 74 43 75 72 73 6f 72 20 7b 0a 20 20 42 74 72 65  tCursor {.  Btre
4390: 65 20 2a 70 42 74 72 65 65 3b 20 20 20 20 20 20  e *pBtree;      
43a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 74 72        /* The Btr
43b0: 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  ee to which this
43c0: 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
43d0: 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
43e0: 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f  Next, *pPrev;  /
43f0: 2a 20 46 6f 72 6d 73 20 61 20 6c 69 6e 6b 65 64  * Forms a linked
4400: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 75 72   list of all cur
4410: 73 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  sors */.  int (*
4420: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
4430: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
4440: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
4450: 3b 20 2f 2a 20 4b 65 79 20 63 6f 6d 70 20 66 75  ; /* Key comp fu
4460: 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
4470: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
4480: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
4490: 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
44a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b    Pgno pgnoRoot;
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
44c0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
44d0: 74 68 69 73 20 74 72 65 65 20 2a 2f 0a 20 20 4d  this tree */.  M
44e0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
44f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4500: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
4510: 68 65 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  he entry */.  in
4520: 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
4530: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
4540: 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 69 6e   of the entry in
4550: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
4560: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  */.  CellInfo in
4570: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
4580: 2a 20 41 20 70 61 72 73 65 20 6f 66 20 74 68 65  * A parse of the
4590: 20 63 65 6c 6c 20 77 65 20 61 72 65 20 70 6f 69   cell we are poi
45a0: 6e 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 75 38  nting at */.  u8
45b0: 20 77 72 46 6c 61 67 3b 20 20 20 20 20 20 20 20   wrFlag;        
45c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
45d0: 69 66 20 77 72 69 74 61 62 6c 65 20 2a 2f 0a 20  if writable */. 
45e0: 20 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20   u8 eState;     
45f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
4600: 65 20 6f 66 20 74 68 65 20 43 55 52 53 4f 52 5f  e of the CURSOR_
4610: 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 28 73  XXX constants (s
4620: 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 20 20 76  ee below) */.  v
4630: 6f 69 64 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  oid *pKey;      
4640: 2f 2a 20 53 61 76 65 64 20 6b 65 79 20 74 68 61  /* Saved key tha
4650: 74 20 77 61 73 20 63 75 72 73 6f 72 27 73 20 6c  t was cursor's l
4660: 61 73 74 20 6b 6e 6f 77 6e 20 70 6f 73 69 74 69  ast known positi
4670: 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  on */.  i64 nKey
4680: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
4690: 20 6f 66 20 70 4b 65 79 2c 20 6f 72 20 6c 61 73   of pKey, or las
46a0: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 2a 2f  t integer key */
46b0: 0a 20 20 69 6e 74 20 73 6b 69 70 3b 20 20 20 20  .  int skip;    
46c0: 20 20 20 20 2f 2a 20 28 73 6b 69 70 3c 30 29 20      /* (skip<0) 
46d0: 2d 3e 20 50 72 65 76 28 29 20 69 73 20 61 20 6e  -> Prev() is a n
46e0: 6f 2d 6f 70 2e 20 28 73 6b 69 70 3e 30 29 20 2d  o-op. (skip>0) -
46f0: 3e 20 4e 65 78 74 28 29 20 69 73 20 2a 2f 0a 23  > Next() is */.#
4700: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4710: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 75 38  IT_INCRBLOB.  u8
4720: 20 63 61 63 68 65 4f 76 65 72 66 6c 6f 77 3b 20   cacheOverflow; 
4730: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4740: 74 6f 20 75 73 65 20 61 4f 76 65 72 66 6c 6f 77  to use aOverflow
4750: 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 61 4f 76 65   */.  Pgno *aOve
4760: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20  rflow;          
4770: 2f 2a 20 43 61 63 68 65 20 6f 66 20 6f 76 65 72  /* Cache of over
4780: 66 6c 6f 77 20 70 61 67 65 20 6c 6f 63 61 74 69  flow page locati
4790: 6f 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ons */.#endif.};
47a0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 74 65 6e 74 69 61  ../*.** Potentia
47b0: 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74 43  l values for BtC
47c0: 75 72 73 6f 72 2e 65 53 74 61 74 65 2e 0a 2a 2a  ursor.eState..**
47d0: 0a 2a 2a 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  .** CURSOR_VALID
47e0: 3a 0a 2a 2a 20 20 20 43 75 72 73 6f 72 20 70 6f  :.**   Cursor po
47f0: 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
4800: 65 6e 74 72 79 2e 20 67 65 74 50 61 79 6c 6f 61  entry. getPayloa
4810: 64 28 29 20 65 74 63 2e 20 6d 61 79 20 62 65 20  d() etc. may be 
4820: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55  called..**.** CU
4830: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3a 0a 2a 2a  RSOR_INVALID:.**
4840: 20 20 20 43 75 72 73 6f 72 20 64 6f 65 73 20 6e     Cursor does n
4850: 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  ot point to a va
4860: 6c 69 64 20 65 6e 74 72 79 2e 20 54 68 69 73 20  lid entry. This 
4870: 63 61 6e 20 68 61 70 70 65 6e 20 28 66 6f 72 20  can happen (for 
4880: 65 78 61 6d 70 6c 65 29 20 0a 2a 2a 20 20 20 62  example) .**   b
4890: 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65  ecause the table
48a0: 20 69 73 20 65 6d 70 74 79 20 6f 72 20 62 65 63   is empty or bec
48b0: 61 75 73 65 20 42 74 72 65 65 43 75 72 73 6f 72  ause BtreeCursor
48c0: 46 69 72 73 74 28 29 20 68 61 73 20 6e 6f 74 20  First() has not 
48d0: 62 65 65 6e 0a 2a 2a 20 20 20 63 61 6c 6c 65 64  been.**   called
48e0: 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 52  ..**.** CURSOR_R
48f0: 45 51 55 49 52 45 53 45 45 4b 3a 0a 2a 2a 20 20  EQUIRESEEK:.**  
4900: 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
4910: 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73 20  this cursor was 
4920: 6f 70 65 6e 65 64 20 6f 6e 20 73 74 69 6c 6c 20  opened on still 
4930: 65 78 69 73 74 73 2c 20 62 75 74 20 68 61 73 20  exists, but has 
4940: 62 65 65 6e 20 0a 2a 2a 20 20 20 6d 6f 64 69 66  been .**   modif
4950: 69 65 64 20 73 69 6e 63 65 20 74 68 65 20 63 75  ied since the cu
4960: 72 73 6f 72 20 77 61 73 20 6c 61 73 74 20 75 73  rsor was last us
4970: 65 64 2e 20 54 68 65 20 63 75 72 73 6f 72 20 70  ed. The cursor p
4980: 6f 73 69 74 69 6f 6e 20 69 73 20 73 61 76 65 64  osition is saved
4990: 0a 2a 2a 20 20 20 69 6e 20 76 61 72 69 61 62 6c  .**   in variabl
49a0: 65 73 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  es BtCursor.pKey
49b0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 6e 4b   and BtCursor.nK
49c0: 65 79 2e 20 57 68 65 6e 20 61 20 63 75 72 73 6f  ey. When a curso
49d0: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 20 20 74 68  r is in .**   th
49e0: 69 73 20 73 74 61 74 65 2c 20 72 65 73 74 6f 72  is state, restor
49f0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
4a00: 73 69 74 69 6f 6e 28 29 20 63 61 6e 20 62 65 20  sition() can be 
4a10: 63 61 6c 6c 65 64 20 74 6f 20 61 74 74 65 6d 70  called to attemp
4a20: 74 20 74 6f 0a 2a 2a 20 20 20 73 65 65 6b 20 74  t to.**   seek t
4a30: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
4a40: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2e   saved position.
4a50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 55 52 53  .*/.#define CURS
4a60: 4f 52 5f 49 4e 56 41 4c 49 44 20 20 20 20 20 20  OR_INVALID      
4a70: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 43       0.#define C
4a80: 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 20 20  URSOR_VALID     
4a90: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
4aa0: 65 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  e CURSOR_REQUIRE
4ab0: 53 45 45 4b 20 20 20 20 20 20 20 32 0a 0a 2f 2a  SEEK       2../*
4ac0: 0a 2a 2a 20 54 68 65 20 54 52 41 43 45 20 6d 61  .** The TRACE ma
4ad0: 63 72 6f 20 77 69 6c 6c 20 70 72 69 6e 74 20 68  cro will print h
4ae0: 69 67 68 2d 6c 65 76 65 6c 20 73 74 61 74 75 73  igh-level status
4af0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
4b00: 75 74 20 74 68 65 0a 2a 2a 20 62 74 72 65 65 20  ut the.** btree 
4b10: 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e 20 74  operation when t
4b20: 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
4b30: 6c 65 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  le sqlite3_btree
4b40: 5f 74 72 61 63 65 20 69 73 0a 2a 2a 20 65 6e 61  _trace is.** ena
4b50: 62 6c 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  bled..*/.#if SQL
4b60: 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e  ITE_TEST.# defin
4b70: 65 20 54 52 41 43 45 28 58 29 20 20 20 69 66 28  e TRACE(X)   if(
4b80: 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74   sqlite3_btree_t
4b90: 72 61 63 65 20 29 5c 0a 2f 2a 20 20 20 20 20 20  race )\./*      
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67    { sqlite3Debug
4bc0: 50 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68  Printf X; fflush
4bd0: 28 73 74 64 6f 75 74 29 3b 20 7d 20 2a 2f 20 5c  (stdout); } */ \
4be0: 0a 7b 20 70 72 69 6e 74 66 20 58 3b 20 66 66 6c  .{ printf X; ffl
4bf0: 75 73 68 28 73 74 64 6f 75 74 29 3b 20 7d 0a 69  ush(stdout); }.i
4c00: 6e 74 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65  nt sqlite3_btree
4c10: 5f 74 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  _trace=0;  /* Tr
4c20: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
4c30: 63 69 6e 67 20 2a 2f 0a 23 65 6c 73 65 0a 23 20  cing */.#else.# 
4c40: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 0a  define TRACE(X).
4c50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
4c60: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
4c70: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
4c80: 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
4c90: 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  tree*,Pgno,BtCur
4ca0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  sor*);../*.** Re
4cb0: 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 74 77  ad or write a tw
4cc0: 6f 2d 20 61 6e 64 20 66 6f 75 72 2d 62 79 74 65  o- and four-byte
4cd0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
4ce0: 67 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ger values..*/.s
4cf0: 74 61 74 69 63 20 75 33 32 20 67 65 74 32 62 79  tatic u32 get2by
4d00: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4d10: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
4d20: 70 5b 30 5d 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b  p[0]<<8) | p[1];
4d30: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 67 65  .}.static u32 ge
4d40: 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20  t4byte(unsigned 
4d50: 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  char *p){.  retu
4d60: 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c 20  rn (p[0]<<24) | 
4d70: 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70 5b  (p[1]<<16) | (p[
4d80: 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d  2]<<8) | p[3];.}
4d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74  .static void put
4da0: 32 62 79 74 65 28 75 6e 73 69 67 6e 65 64 20 63  2byte(unsigned c
4db0: 68 61 72 20 2a 70 2c 20 75 33 32 20 76 29 7b 0a  har *p, u32 v){.
4dc0: 20 20 70 5b 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20    p[0] = v>>8;. 
4dd0: 20 70 5b 31 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61   p[1] = v;.}.sta
4de0: 74 69 63 20 76 6f 69 64 20 70 75 74 34 62 79 74  tic void put4byt
4df0: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4e00: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
4e10: 30 5d 20 3d 20 76 3e 3e 32 34 3b 0a 20 20 70 5b  0] = v>>24;.  p[
4e20: 31 5d 20 3d 20 76 3e 3e 31 36 3b 0a 20 20 70 5b  1] = v>>16;.  p[
4e30: 32 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 33  2] = v>>8;.  p[3
4e40: 5d 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = v;.}../*.** 
4e50: 52 6f 75 74 69 6e 65 73 20 74 6f 20 72 65 61 64  Routines to read
4e60: 20 61 6e 64 20 77 72 69 74 65 20 76 61 72 69 61   and write varia
4e70: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
4e80: 65 72 73 2e 20 20 54 68 65 73 65 20 75 73 65 64  ers.  These used
4e90: 20 74 6f 0a 2a 2a 20 62 65 20 64 65 66 69 6e 65   to.** be define
4ea0: 64 20 6c 6f 63 61 6c 6c 79 2c 20 62 75 74 20 6e  d locally, but n
4eb0: 6f 77 20 77 65 20 75 73 65 20 74 68 65 20 76 61  ow we use the va
4ec0: 72 69 6e 74 20 72 6f 75 74 69 6e 65 73 20 69 6e  rint routines in
4ed0: 20 74 68 65 20 75 74 69 6c 2e 63 0a 2a 2a 20 66   the util.c.** f
4ee0: 69 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ile..*/.#define 
4ef0: 67 65 74 56 61 72 69 6e 74 20 20 20 20 73 71 6c  getVarint    sql
4f00: 69 74 65 33 47 65 74 56 61 72 69 6e 74 0a 2f 2a  ite3GetVarint./*
4f10: 20 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69   #define getVari
4f20: 6e 74 33 32 20 20 73 71 6c 69 74 65 33 47 65 74  nt32  sqlite3Get
4f30: 56 61 72 69 6e 74 33 32 20 2a 2f 0a 23 64 65 66  Varint32 */.#def
4f40: 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 28  ine getVarint32(
4f50: 41 2c 42 29 20 20 28 28 2a 42 3d 2a 28 41 29 29  A,B)  ((*B=*(A))
4f60: 3c 3d 30 78 37 66 3f 31 3a 73 71 6c 69 74 65 33  <=0x7f?1:sqlite3
4f70: 47 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29  GetVarint32(A,B)
4f80: 29 0a 23 64 65 66 69 6e 65 20 70 75 74 56 61 72  ).#define putVar
4f90: 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 50 75  int    sqlite3Pu
4fa0: 74 56 61 72 69 6e 74 0a 0a 2f 2a 20 54 68 65 20  tVarint../* The 
4fb0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 74 68  database page th
4fc0: 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6f  e PENDING_BYTE o
4fd0: 63 63 75 70 69 65 73 2e 20 54 68 69 73 20 70 61  ccupies. This pa
4fe0: 67 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  ge is never used
4ff0: 2e 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  ..** TODO: This 
5000: 6d 61 63 72 6f 20 69 73 20 76 65 72 79 20 73 69  macro is very si
5010: 6d 69 6c 61 72 79 20 74 6f 20 50 41 47 45 52 5f  milary to PAGER_
5020: 4d 4a 5f 50 47 4e 4f 28 29 20 69 6e 20 70 61 67  MJ_PGNO() in pag
5030: 65 72 2e 63 2e 20 54 68 65 79 0a 2a 2a 20 73 68  er.c. They.** sh
5040: 6f 75 6c 64 20 70 6f 73 73 69 62 6c 79 20 62 65  ould possibly be
5050: 20 63 6f 6e 73 6f 6c 69 64 61 74 65 64 20 28 70   consolidated (p
5060: 72 65 73 75 6d 61 62 6c 79 20 69 6e 20 70 61 67  resumably in pag
5070: 65 72 2e 68 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  er.h)..**.** If 
5080: 64 69 73 6b 20 49 2f 4f 20 69 73 20 6f 6d 69 74  disk I/O is omit
5090: 74 65 64 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ted (meaning tha
50a0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  t the database i
50b0: 73 20 73 74 6f 72 65 64 20 70 75 72 65 6c 79 0a  s stored purely.
50c0: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 29 20 74 68  ** in memory) th
50d0: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  en there is no p
50e0: 65 6e 64 69 6e 67 20 62 79 74 65 2e 0a 2a 2f 0a  ending byte..*/.
50f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5100: 49 54 5f 44 49 53 4b 49 4f 0a 23 20 64 65 66 69  IT_DISKIO.# defi
5110: 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ne PENDING_BYTE_
5120: 50 41 47 45 28 70 42 74 29 20 20 30 78 37 66 66  PAGE(pBt)  0x7ff
5130: 66 66 66 66 66 0a 23 65 6c 73 65 0a 23 20 64 65  fffff.#else.# de
5140: 66 69 6e 65 20 50 45 4e 44 49 4e 47 5f 42 59 54  fine PENDING_BYT
5150: 45 5f 50 41 47 45 28 70 42 74 29 20 28 28 50 45  E_PAGE(pBt) ((PE
5160: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 70 42 74 29  NDING_BYTE/(pBt)
5170: 2d 3e 70 61 67 65 53 69 7a 65 29 2b 31 29 0a 23  ->pageSize)+1).#
5180: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c  endif../*.** A l
5190: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68  inked list of th
51a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
51b0: 63 74 75 72 65 73 20 69 73 20 73 74 6f 72 65 64  ctures is stored
51c0: 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4c 6f   at BtShared.pLo
51d0: 63 6b 2e 0a 2a 2a 20 4c 6f 63 6b 73 20 61 72 65  ck..** Locks are
51e0: 20 61 64 64 65 64 20 28 6f 72 20 75 70 67 72 61   added (or upgra
51f0: 64 65 64 20 66 72 6f 6d 20 52 45 41 44 5f 4c 4f  ded from READ_LO
5200: 43 4b 20 74 6f 20 57 52 49 54 45 5f 4c 4f 43 4b  CK to WRITE_LOCK
5210: 29 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20  ) when a cursor 
5220: 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  .** is opened on
5230: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5240: 72 6f 6f 74 20 70 61 67 65 20 42 74 53 68 61 72  root page BtShar
5250: 65 64 2e 69 54 61 62 6c 65 2e 20 4c 6f 63 6b 73  ed.iTable. Locks
5260: 20 61 72 65 20 72 65 6d 6f 76 65 64 0a 2a 2a 20   are removed.** 
5270: 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 77  from this list w
5280: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
5290: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f  n is committed o
52a0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 6f  r rolled back, o
52b0: 72 20 77 68 65 6e 0a 2a 2a 20 61 20 62 74 72 65  r when.** a btre
52c0: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
52d0: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 74  ed..*/.struct Bt
52e0: 4c 6f 63 6b 20 7b 0a 20 20 42 74 72 65 65 20 2a  Lock {.  Btree *
52f0: 70 42 74 72 65 65 3b 20 20 20 20 20 20 20 20 2f  pBtree;        /
5300: 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 68  * Btree handle h
5310: 6f 6c 64 69 6e 67 20 74 68 69 73 20 6c 6f 63 6b  olding this lock
5320: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 61 62 6c   */.  Pgno iTabl
5330: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  e;          /* R
5340: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
5350: 65 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  e */.  u8 eLock;
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5370: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
5380: 54 45 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c  TE_LOCK */.  BtL
5390: 6f 63 6b 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ock *pNext;     
53a0: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 42 74     /* Next in Bt
53b0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
53c0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64  t */.};../* Cand
53d0: 69 64 61 74 65 20 76 61 6c 75 65 73 20 66 6f 72  idate values for
53e0: 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f   BtLock.eLock */
53f0: 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f 4c 4f  .#define READ_LO
5400: 43 4b 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  CK     1.#define
5410: 20 57 52 49 54 45 5f 4c 4f 43 4b 20 20 20 20 32   WRITE_LOCK    2
5420: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5430: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
5440: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  E.  /*.  ** The 
5450: 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54  functions queryT
5460: 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b  ableLock(), lock
5470: 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f  Table() and unlo
5480: 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20  ckAllTables().  
5490: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
54a0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
54b0: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
54c0: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
54d0: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
54e0: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
54f0: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
5500: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
5510: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
5520: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
5530: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
5540: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
5550: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
5560: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
5570: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
5580: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
5590: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
55a0: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
55b0: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
55c0: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
55d0: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
55e0: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
55f0: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c  ueryTableLock(a,
5600: 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  b,c) SQLITE_OK. 
5610: 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62   #define lockTab
5620: 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  le(a,b,c) SQLITE
5630: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e  _OK.  #define un
5640: 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29  lockAllTables(a)
5650: 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a 2a 20 51 75  .#else../*.** Qu
5660: 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62 74  ery to see if bt
5670: 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79  ree handle p may
5680: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
5690: 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a  f type eLock .**
56a0: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
56b0: 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68  RITE_LOCK) on th
56c0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
56d0: 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74  t-page iTab. Ret
56e0: 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
56f0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79   if the lock may
5700: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79   be obtained (by
5710: 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61 62   calling lockTab
5720: 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c  le()), or.** SQL
5730: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
5740: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5750: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
5760: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
5770: 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  Tab, u8 eLock){.
5780: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
5790: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
57a0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a  ck *pIter;..  /*
57b0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
57c0: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
57d0: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
57e0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  led */.  if( 0==
57f0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
5800: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
5810: 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20  SharedData ){.  
5820: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5830: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  OK;.  }..  /* Th
5840: 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c  is (along with l
5850: 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77  ockTable()) is w
5860: 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e 63  here the ReadUnc
5870: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
5880: 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
5890: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
58a0: 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20  is querying for 
58b0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20  a read-lock and 
58c0: 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  the flag is.  **
58d0: 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f   set, it is unco
58e0: 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e  nditionally gran
58f0: 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68  ted - even if th
5900: 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f  ere are write-lo
5910: 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  cks.  ** on the 
5920: 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74  table. If a writ
5930: 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  e-lock is reques
5940: 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63  ted, the ReadUnc
5950: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20  ommitted flag.  
5960: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
5970: 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ered..  **.  ** 
5980: 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b  In function lock
5990: 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65  Table(), if a re
59a0: 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e  ad-lock is deman
59b0: 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a  ded and the .  *
59c0: 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  * ReadUncommitte
59d0: 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e  d flag is set, n
59e0: 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64  o entry is added
59f0: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69   to the locks li
5a00: 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72  st .  ** (BtShar
5a10: 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a  ed.pLock)..  **.
5a20: 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a    ** To summariz
5a30: 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e  e: If the ReadUn
5a40: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
5a50: 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64  s set, then read
5a60: 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a   cursors do.  **
5a70: 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72   not create or r
5a80: 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63  espect table loc
5a90: 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  ks. The locking 
5aa0: 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20  procedure for a 
5ab0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73  .  ** write-curs
5ac0: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  or does not chan
5ad0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a  ge..  */.  if( .
5ae0: 20 20 20 20 21 70 2d 3e 70 53 71 6c 69 74 65 20      !p->pSqlite 
5af0: 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 70  || .    0==(p->p
5b00: 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53 51  Sqlite->flags&SQ
5b10: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
5b20: 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c  tted) || .    eL
5b30: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
5b40: 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53  ||.    iTab==MAS
5b50: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
5b60: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
5b70: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
5b80: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
5b90: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
5ba0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
5bb0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
5bc0: 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20 20  =iTab && .      
5bd0: 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63      (pIter->eLoc
5be0: 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63  k!=eLock || eLoc
5bf0: 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b  k!=READ_LOCK) ){
5c00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5c10: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
5c20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5c30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5c40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
5c50: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
5c60: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
5c70: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
5c80: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
5c90: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
5ca0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
5cb0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
5cc0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
5cd0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
5ce0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
5cf0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5d00: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
5d10: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
5d20: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
5d30: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
5d40: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
5d50: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
5d60: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61  tatic int lockTa
5d70: 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ble(Btree *p, Pg
5d80: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
5d90: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
5da0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
5db0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
5dc0: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
5dd0: 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Iter;..  /* This
5de0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
5df0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
5e00: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
5e10: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
5e20: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
5e30: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
5e40: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  dData ){.    ret
5e50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5e60: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
5e70: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61  LITE_OK==queryTa
5e80: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
5e90: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
5ea0: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
5eb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
5ec0: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
5ed0: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
5ee0: 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ted,.  ** return
5ef0: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61   early without a
5f00: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
5f10: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
5f20: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
5f30: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
5f40: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62  unction queryTab
5f50: 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72  leLock() for mor
5f60: 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69  e info on handli
5f70: 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ng .  ** the Rea
5f80: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
5f90: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
5fa0: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 29 20     (p->pSqlite) 
5fb0: 26 26 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c  && .    (p->pSql
5fc0: 69 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  ite->flags&SQLIT
5fd0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
5fe0: 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63  d) && .    (eLoc
5ff0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26  k==READ_LOCK) &&
6000: 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53  .    iTable!=MAS
6010: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
6020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6030: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
6040: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
6050: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
6060: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
6070: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
6080: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
6090: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
60a0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
60b0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
60c0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
60d0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
60e0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
60f0: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
6100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6110: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
6120: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
6130: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
6140: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
6150: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
6160: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
6170: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
6180: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
6190: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
61a0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
61b0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
61c0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  ock *)sqliteMall
61d0: 6f 63 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  oc(sizeof(BtLock
61e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
61f0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
6200: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6210: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
6220: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
6230: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
6240: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
6250: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
6260: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
6270: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
6280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
6290: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
62a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
62b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
62c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
62d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
62e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
62f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
6300: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
6310: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
6320: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
6330: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
6340: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
6350: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
6360: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
6370: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
6380: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
6390: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
63a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
63b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
63c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
63d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
63e0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
63f0: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
6400: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
6410: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
6420: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
6430: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
6440: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
6450: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
6460: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
6470: 20 2a 70 29 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a   *p){.  BtLock *
6480: 2a 70 70 49 74 65 72 20 3d 20 26 70 2d 3e 70 42  *ppIter = &p->pB
6490: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  t->pLock;..  /* 
64a0: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  If the shared-ca
64b0: 63 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  che extension is
64c0: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 2c 20 74 68   not enabled, th
64d0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  ere should be no
64e0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 74  .  ** locks in t
64f0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
6500: 6b 20 6c 69 73 74 2c 20 6d 61 6b 69 6e 67 20 74  k list, making t
6510: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 20  his procedure a 
6520: 6e 6f 2d 6f 70 2e 20 41 73 73 65 72 74 0a 20 20  no-op. Assert.  
6530: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
6540: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
6550: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6560: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
6570: 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44  ly()->useSharedD
6580: 61 74 61 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ata || 0==*ppIte
6590: 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  r );..  while( *
65a0: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
65b0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
65c0: 70 49 74 65 72 3b 0a 20 20 20 20 69 66 28 20 70  pIter;.    if( p
65d0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
65e0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
65f0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
6600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
6610: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65  e(pLock);.    }e
6620: 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65  lse{.      ppIte
6630: 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78  r = &pLock->pNex
6640: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  t;.    }.  }.}.#
6650: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6660: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6670: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
6680: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
6690: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
66a0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
66b0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ence */../*.** S
66c0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
66d0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
66e0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
66f0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
6700: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
6710: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
6720: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
6730: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
6740: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
6750: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
6760: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
6770: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6780: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
6790: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
67a0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
67b0: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
67c0: 4b 65 79 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  Key );..  rc = s
67d0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
67e0: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
67f0: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
6800: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
6810: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
6820: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
6830: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
6840: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
6850: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
6860: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
6870: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
6880: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
6890: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
68a0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
68b0: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
68c0: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
68d0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
68e0: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
68f0: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
6900: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
6910: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
6920: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
6930: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
6940: 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
6950: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
6960: 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
6970: 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  oc(pCur->nKey);.
6980: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
6990: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
69a0: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
69b0: 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20   0, pCur->nKey, 
69c0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
69d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
69e0: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
69f0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
6a00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6a10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
6a20: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
6a30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
6a40: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6a50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6a60: 72 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67 65  rt( !pCur->pPage
6a70: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
6a80: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
6a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6aa0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
6ab0: 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
6ac0: 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
6ad0: 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
6ae0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6af0: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
6b00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6b10: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
6b20: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63   /* Delete the c
6b30: 61 63 68 65 20 6f 66 20 6f 76 65 72 66 6c 6f 77  ache of overflow
6b40: 20 70 61 67 65 20 6e 75 6d 62 65 72 73 2e 20 2a   page numbers. *
6b50: 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  /.  sqliteFree(p
6b60: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
6b70: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
6b80: 6f 77 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ow = 0;.#endif..
6b90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6ba0: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
6bb0: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
6bc0: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
6bd0: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
6be0: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
6bf0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
6c00: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
6c10: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
6c20: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
6c30: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
6c40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
6c50: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
6c60: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
6c70: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
6c80: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
6c90: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
6ca0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
6cb0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6cc0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
6cd0: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
6ce0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
6cf0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6d00: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6d10: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6d20: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
6d30: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
6d40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6d50: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
6d60: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
6d70: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
6d80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6d90: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
6da0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
6db0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6dc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6de0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6df0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
6e00: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
6e10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6e20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6e30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
6e40: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
6e50: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
6e60: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6e70: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
6e80: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
6e90: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
6ea0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
6eb0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
6ec0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
6ed0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
6ee0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
6ef0: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
6f00: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
6f10: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
6f20: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
6f30: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
6f40: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
6f50: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
6f60: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
6f70: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
6f80: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
6f90: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
6fa0: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
6fb0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6fc0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
6fd0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6fe0: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
6ff0: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
7000: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
7010: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
7020: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
7030: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
7040: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
7050: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
7060: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
7070: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
7080: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73  OR_INVALID..*/.s
7090: 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72  tatic int restor
70a0: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
70b0: 73 69 74 69 6f 6e 58 28 42 74 43 75 72 73 6f 72  sitionX(BtCursor
70c0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
70d0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  c;.  assert( pCu
70e0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
70f0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
7100: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
7110: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
7120: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7130: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
7140: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
7150: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
7160: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
7170: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7180: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
7190: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
71a0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
71b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
71c0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
71d0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
71e0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71f0: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a  _INVALID );.  }.
7200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7210: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f  #define restoreO
7220: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
7230: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
7240: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52  eState==CURSOR_R
7250: 45 51 55 49 52 45 53 45 45 4b 3f 72 65 73 74 6f  EQUIRESEEK?resto
7260: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
7270: 6f 73 69 74 69 6f 6e 58 28 70 29 3a 53 51 4c 49  ositionX(p):SQLI
7280: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
7290: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
72a0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65  VACUUM./*.** The
72b0: 73 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  se macros define
72c0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
72d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
72e0: 20 65 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a   entry for a .**
72f0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
7300: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7310: 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68  nt to each is th
7320: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  e number of usab
7330: 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65  le.** bytes on e
7340: 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20  ach page of the 
7350: 64 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20  database (often 
7360: 31 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e  1024). The secon
7370: 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  d is the.** page
7380: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20   number to look 
7390: 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  up in the pointe
73a0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  r map..**.** PTR
73b0: 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72  MAP_PAGENO retur
73c0: 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
73d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
73e0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
73f0: 2a 20 70 61 67 65 20 74 68 61 74 20 73 74 6f 72  * page that stor
7400: 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
7410: 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f  pointer. PTRMAP_
7420: 50 54 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e  PTROFFSET return
7430: 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20  s.** the offset 
7440: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
7450: 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a   map entry..**.*
7460: 2a 20 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72  * If the pgno ar
7470: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
7480: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69   PTRMAP_PAGENO i
7490: 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  s a pointer-map 
74a0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67  page,.** then pg
74b0: 6e 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  no is returned. 
74c0: 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50  So (pgno==PTRMAP
74d0: 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67  _PAGENO(pgsz, pg
74e0: 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75  no)) can be.** u
74f0: 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 70  sed to test if p
7500: 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72  gno is a pointer
7510: 2d 6d 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41  -map page. PTRMA
7520: 50 5f 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65  P_ISPAGE impleme
7530: 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74  nts.** this test
7540: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52  ..*/.#define PTR
7550: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7560: 70 67 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65  pgno) ptrmapPage
7570: 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64  no(pBt, pgno).#d
7580: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52  efine PTRMAP_PTR
7590: 4f 46 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f  OFFSET(pBt, pgno
75a0: 29 20 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61  ) (5*(pgno-ptrma
75b0: 70 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e  pPageno(pBt, pgn
75c0: 6f 29 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50  o)-1)).#define P
75d0: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
75e0: 2c 20 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f  , pgno) (PTRMAP_
75f0: 50 41 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67  PAGENO((pBt),(pg
7600: 6e 6f 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73  no))==(pgno))..s
7610: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7620: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7630: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7640: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7650: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
7660: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
7670: 31 3b 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70  1;.  int iPtrMap
7680: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
7690: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
76a0: 69 6e 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d  int ret = (iPtrM
76b0: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
76c0: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
76d0: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
76e0: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
76f0: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7700: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7710: 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  /*.** The pointe
7720: 72 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75  r map is a looku
7730: 70 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65  p table that ide
7740: 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65  ntifies the pare
7750: 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65  nt page for.** e
7760: 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69  ach child page i
7770: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7780: 69 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74  ile.  The parent
7790: 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
77a0: 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  e that.** contai
77b0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
77c0: 74 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72  the child.  Ever
77d0: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  y page in the da
77e0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a  tabase contains.
77f0: 2a 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74  ** 0 or 1 parent
7800: 20 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69   pages.  (In thi
7810: 73 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62  s context 'datab
7820: 61 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73  ase page' refers
7830: 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20  .** to any page 
7840: 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74  that is not part
7850: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
7860: 6d 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61  map itself.)  Ea
7870: 63 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a  ch pointer map.*
7880: 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73  * entry consists
7890: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74   of a single byt
78a0: 65 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34  e 'type' and a 4
78b0: 20 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67   byte parent pag
78c0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65  e number..** The
78d0: 20 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e   PTRMAP_XXX iden
78e0: 74 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72  tifiers below ar
78f0: 65 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65  e the valid type
7900: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72  s..**.** The pur
7910: 70 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  pose of the poin
7920: 74 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61  ter map is to fa
7930: 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61  cility moving pa
7940: 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ges from one.** 
7950: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
7960: 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  file to another 
7970: 61 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76  as part of autov
7980: 61 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70  acuum.  When a p
7990: 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c  age.** is moved,
79a0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20   the pointer in 
79b0: 69 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20  its parent must 
79c0: 62 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f  be updated to po
79d0: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65  int to the.** ne
79e0: 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65  w location.  The
79f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
7a00: 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
7a10: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71  he parent page q
7a20: 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54  uickly..**.** PT
7a30: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54  RMAP_ROOTPAGE: T
7a40: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7a50: 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e   is a root-page.
7a60: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
7a70: 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
7a90: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
7aa0: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45  *.** PTRMAP_FREE
7ab0: 50 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61  PAGE: The databa
7ac0: 73 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e  se page is an un
7ad0: 75 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65  used (free) page
7ae0: 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  . The page-numbe
7af0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
7b00: 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73         is not us
7b10: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
7b20: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
7b30: 45 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74  ERFLOW1: The dat
7b40: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68  abase page is th
7b50: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
7b60: 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20  a list of .**   
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7b90: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
7ba0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
7bb0: 61 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  age that.**     
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7bd0: 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
7be0: 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74  with a pointer t
7bf0: 6f 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  o this overflow 
7c00: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  page..**.** PTRM
7c10: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68  AP_OVERFLOW2: Th
7c20: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7c30: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  is the second or
7c40: 20 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61   later page in a
7c50: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
7c70: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
7c80: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64  e page-number id
7c90: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65  entifies the pre
7ca0: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  vious.**        
7cb0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
7cc0: 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
7cd0: 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  page list..**.**
7ce0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54   PTRMAP_BTREE: T
7cf0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7d00: 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62   is a non-root b
7d10: 74 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70  tree page. The p
7d20: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  age number.**   
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e              iden
7d40: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
7d50: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74  t page in the bt
7d60: 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ree..*/.#define 
7d70: 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
7d80: 31 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  1.#define PTRMAP
7d90: 5f 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66  _FREEPAGE 2.#def
7da0: 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  ine PTRMAP_OVERF
7db0: 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50  LOW1 3.#define P
7dc0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
7dd0: 34 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  4.#define PTRMAP
7de0: 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20  _BTREE 5../*.** 
7df0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7e00: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7e10: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7e20: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7e30: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7e40: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7e50: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7e60: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7e70: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7e80: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7e90: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7ea0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7eb0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7ec0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7ed0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7ee0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7ef0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
7f00: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7f10: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
7f20: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
7f30: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
7f40: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
7f50: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7f60: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
7f70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7f80: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
7f90: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
7fa0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7fb0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
7fc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
7fd0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
7fe0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
7ff0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
8000: 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d   rc;..  /* The m
8010: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
8020: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
8030: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
8040: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
8050: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
8060: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
8070: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
8080: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
8090: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
80a0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
80b0: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
80c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
80d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
80e0: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
80f0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8100: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
8110: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
8120: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
8130: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
8140: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8150: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
8160: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
8170: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
8180: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
8190: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
81a0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
81b0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
81c0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
81d0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
81e0: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
81f0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
8200: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
8210: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
8220: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
8230: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
8240: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72   parent));.    r
8250: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
8260: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
8270: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8280: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
8290: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
82a0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
82b0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
82c0: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
82d0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
82e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
82f0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72  ef(pDbPage);.  r
8300: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8310: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
8320: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
8330: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
8340: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
8350: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
8360: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
8370: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
8380: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
8390: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
83a0: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
83b0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
83c0: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
83d0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
83e0: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
83f0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
8400: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
8410: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
8420: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
8430: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
8440: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
8450: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
8460: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
8470: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
8480: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8490: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
84a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
84b0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
84c0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
84d0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
84e0: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
84f0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8500: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8510: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
8520: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
8530: 74 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70  t rc;..  iPtrmap
8540: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
8550: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
8560: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
8570: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
8580: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
8590: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
85a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
85b0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
85c0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
85d0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
85e0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
85f0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
8600: 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  ET(pBt, key);.  
8610: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
8620: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
8630: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
8640: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
8650: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
8660: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8670: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
8680: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8690: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
86a0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
86b0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
86c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
86d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
86e0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
86f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
8700: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
8710: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
8720: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
8730: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
8740: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
8750: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
8760: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
8770: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
8780: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
8790: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
87a0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
87b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
87c0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
87d0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
87e0: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
87f0: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  low cells..*/.st
8800: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c  atic u8 *findCel
8810: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
8820: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
8830: 75 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  u8 *data = pPage
8840: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
8850: 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20  t( iCell>=0 );. 
8860: 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67   assert( iCell<g
8870: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
8880: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
8890: 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  ]) );.  return d
88a0: 61 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26  ata + get2byte(&
88b0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
88c0: 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29  Offset+2*iCell])
88d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
88e0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
88f0: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
8900: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
8910: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
8920: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
8930: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
8940: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
8950: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
8960: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
8970: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8980: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
8990: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
89a0: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
89b0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
89c0: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
89d0: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
89e0: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
89f0: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
8a00: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
8a10: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
8a20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
8a30: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
8a40: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
8a50: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
8a60: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
8a70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8a80: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8a90: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
8aa0: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
8ab0: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
8ac0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
8ad0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
8ae0: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
8af0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8b00: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61  is function.  pa
8b10: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
8b20: 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20  a cell index.** 
8b30: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
8b40: 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65  gument and parse
8b50: 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20  CellPtr() takes 
8b60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8b70: 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20  .** body of the 
8b80: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
8b90: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
8ba0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
8bb0: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
8bc0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8bd0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8be0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8bf0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c10: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8c20: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8c30: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8c40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8c50: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8c60: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20   */.){.  int n; 
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
8c90: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
8ca0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
8cb0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
8cc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8cd0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
8ce0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49  payload */..  pI
8cf0: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
8d00: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
8d10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
8d20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
8d30: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
8d40: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
8d50: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
8d60: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
8d70: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
8d80: 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  a ){.    n += ge
8d90: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8da0: 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  [n], &nPayload);
8db0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
8dc0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a  ayload = 0;.  }.
8dd0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
8de0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28   nPayload;.  if(
8df0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
8e00: 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  {.    n += getVa
8e10: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
8e20: 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e  (u64 *)&pInfo->n
8e30: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
8e40: 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20     u32 x;.    n 
8e50: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
8e60: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20  pCell[n], &x);. 
8e70: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
8e80: 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   x;.    nPayload
8e90: 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e   += x;.  }.  pIn
8ea0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8eb0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8ec0: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
8ed0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
8ee0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8ef0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
8f00: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
8f10: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
8f20: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
8f30: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
8f40: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
8f50: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
8f60: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
8f70: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
8f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
8f90: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
8fa0: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
8fb0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  */.    pInfo->nL
8fc0: 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  ocal = nPayload;
8fd0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
8fe0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e  rflow = 0;.    n
8ff0: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
9000: 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  + n;.    if( nSi
9010: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53  ze<4 ){.      nS
9020: 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20  ize = 4;        
9030: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
9040: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20  size is 4 */.   
9050: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53   }.    pInfo->nS
9060: 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d  ize = nSize;.  }
9070: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
9080: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9090: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
90a0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
90b0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
90c0: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
90d0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
90e0: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
90f0: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
9100: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
9110: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
9120: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
9130: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
9140: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
9150: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
9160: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
9170: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
9180: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
9190: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
91a0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
91b0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
91c0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
91d0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
91e0: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
91f0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
9200: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
9210: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
9220: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
9230: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
9240: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
9250: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
9260: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
9270: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
9280: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
9290: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
92a0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
92b0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
92c0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
92d0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
92e0: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
92f0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
9300: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
9310: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
9320: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9330: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
9340: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
9350: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
9360: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
9370: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
9380: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
9390: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
93a0: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
93b0: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
93c0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
93d0: 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a  ocal = surplus;.
93e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93f0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9400: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
9410: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
9420: 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e  rflow = pInfo->n
9430: 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70  Local + n;.    p
9440: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
9450: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
9460: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
9470: 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c 28   void parseCell(
9480: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9490: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
94a0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
94b0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
94c0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
94d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
94e0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
94f0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
9500: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9510: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9520: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9530: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
9540: 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43  Ptr(pPage, findC
9550: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9560: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
9570: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
9580: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
9590: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
95a0: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
95b0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
95c0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
95d0: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
95e0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
95f0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9600: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
9610: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
9620: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
9630: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
9640: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
9650: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
9660: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  r..*/.#ifndef ND
9670: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
9680: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9690: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
96a0: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
96b0: 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c  info;.  parseCel
96c0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
96d0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
96e0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
96f0: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
9700: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
9710: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9720: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
9730: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73  nfo info;.  pars
9740: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
9750: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
9760: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
9770: 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ze;.}..#ifndef S
9780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9790: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
97a0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
97b0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
97c0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
97d0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
97e0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
97f0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
9800: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
9810: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9820: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9830: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
9840: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
9850: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
9860: 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65  Cell){.  if( pCe
9870: 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  ll ){.    CellIn
9880: 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72  fo info;.    par
9890: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
98a0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
98b0: 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
98c0: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
98d0: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
98e0: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
98f0: 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28  oad );.    if( (
9900: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
9910: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
9920: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
9930: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  cal ){.      Pgn
9940: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
9950: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
9960: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
9970: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
9980: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
9990: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
99a0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
99b0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
99c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
99d0: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ;.}./*.** If the
99e0: 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78   cell with index
99f0: 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70   iCell on page p
9a00: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
9a10: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
9a20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
9a30: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
9a40: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
9a50: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
9a60: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
9a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
9a80: 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61  mapPutOvfl(MemPa
9a90: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
9aa0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65  Cell){.  u8 *pCe
9ab0: 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  ll;.  pCell = fi
9ac0: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
9ad0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Page, iCell);.  
9ae0: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
9af0: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
9b00: 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Cell);.}.#endif.
9b10: 0a 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f 66 20  ../* A bunch of 
9b20: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
9b30: 6e 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68 65  nts to check the
9b40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
9b50: 74 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  te variables.** 
9b60: 6f 66 20 68 61 6e 64 6c 65 20 70 20 28 74 79 70  of handle p (typ
9b70: 65 20 42 74 72 65 65 2a 29 20 61 72 65 20 69 6e  e Btree*) are in
9b80: 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
9b90: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
9ba0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
9bb0: 29 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ) \.  assert( p-
9bc0: 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
9bd0: 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e  NONE || p->pBt->
9be0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e  nTransaction<p->
9bf0: 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20  pBt->nRef ); \. 
9c00: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
9c10: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70  >nTransaction<=p
9c20: 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c  ->pBt->nRef ); \
9c30: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
9c40: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
9c50: 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20  !=TRANS_NONE || 
9c60: 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  p->pBt->nTransac
9c70: 74 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61  tion==0 ); \.  a
9c80: 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69  ssert( p->pBt->i
9c90: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d  nTransaction>=p-
9ca0: 3e 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a  >inTrans ); ../*
9cb0: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
9cc0: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
9cd0: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
9ce0: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
9cf0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
9d00: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
9d10: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
9d20: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
9d30: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
9d40: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
9d50: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
9d60: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
9d70: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
9d80: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a  ontent area..*/.
9d90: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
9da0: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
9db0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
9dc0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9dd0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
9de0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
9df0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
9e00: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
9e10: 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c  ss of a i-th cel
9e20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  l */.  int addr;
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
9e50: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
9e60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
9e70: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ay */.  int hdr;
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9ea0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
9eb0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
9ee0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
9ef0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
9f00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
9f10: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
9f20: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
9f30: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
9f40: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
9f50: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
9f60: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
9f70: 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
9f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
9f90: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
9fa0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9fb0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
9fe0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
9ff0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a000: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
a010: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
a020: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a030: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
a040: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
a050: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ll content */.. 
a060: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a070: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a080: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a090: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a0a0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a0b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a0c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a0d0: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
a0e0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
a0f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
a100: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 65  rflow==0 );.  te
a110: 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mp = sqliteMallo
a120: 63 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  c( pPage->pBt->p
a130: 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  ageSize );.  if(
a140: 20 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72   temp==0 ) retur
a150: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a160: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
a170: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
a180: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a190: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
a1a0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
a1b0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
a1c0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
a1d0: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
a1e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
a1f0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
a200: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
a210: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62  >usableSize;.  b
a220: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
a230: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
a240: 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d  emcpy(&temp[brk]
a250: 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
a260: 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b  ableSize - brk);
a270: 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53  .  brk = usableS
a280: 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ize;.  for(i=0; 
a290: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
a2a0: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
a2b0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
a2c0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
a2d0: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
a2e0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
a2f0: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
a300: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
a310: 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67   assert( pc<pPag
a320: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a330: 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  ze );.    size =
a340: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
a350: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
a360: 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b      brk -= size;
a370: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
a380: 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  a[brk], &temp[pc
a390: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
a3a0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72  t2byte(pAddr, br
a3b0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
a3c0: 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65  ( brk>=cellOffse
a3d0: 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  t+2*nCell );.  p
a3e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a3f0: 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61  r+5], brk);.  da
a400: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
a410: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
a420: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
a430: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
a440: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
a450: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
a460: 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61  [addr], 0, brk-a
a470: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ddr);.  sqliteFr
a480: 65 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74 75  ee(temp);.  retu
a490: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a4a0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
a4b0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
a4c0: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
a4d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
a4e0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
a4f0: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
a500: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
a510: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
a520: 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e  ation. Or return
a530: 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   0 if there is n
a540: 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a  ot enough free.*
a550: 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  * space on the p
a560: 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20 74  age to satisfy t
a570: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65  he allocation re
a580: 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  quest..**.** If 
a590: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
a5a0: 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65  s nBytes of free
a5b0: 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20   space but does 
a5c0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  not contain.** n
a5d0: 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75  Bytes of contigu
a5e0: 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20  ous free space, 
a5f0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
a600: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  e automatically.
a610: 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65  ** calls defrage
a620: 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f  mentPage() to co
a630: 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72  nsolidate all fr
a640: 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ee space before 
a650: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74  .** allocating t
a660: 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f  he new chunk..*/
a670: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
a680: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
a690: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
a6a0: 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  yte){.  int addr
a6b0: 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74  , pc, hdr;.  int
a6c0: 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72   size;.  int nFr
a6d0: 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20  ag;.  int top;. 
a6e0: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
a6f0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  t cellOffset;.  
a700: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
a710: 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d  ata;.  .  data =
a720: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
a730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a740: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a750: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a760: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a770: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 69 66  age->pBt );.  if
a780: 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74  ( nByte<4 ) nByt
a790: 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61  e = 4;.  if( pPa
a7a0: 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20  ge->nFree<nByte 
a7b0: 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
a7c0: 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30  low>0 ) return 0
a7d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
a7e0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72   -= nByte;.  hdr
a7f0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
a800: 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  set;..  nFrag = 
a810: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
a820: 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20  f( nFrag<60 ){. 
a830: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
a840: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
a850: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
a860: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
a870: 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70  fy the.    ** sp
a880: 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a  ace request. */.
a890: 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31      addr = hdr+1
a8a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63  ;.    while( (pc
a8b0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a8c0: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
a8d0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
a8e0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
a8f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
a900: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
a910: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79      if( size<nBy
a920: 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  te+4 ){.        
a930: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
a940: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
a950: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
a960: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72  ata[hdr+7] = nFr
a970: 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  ag + size - nByt
a980: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e;.          ret
a990: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
a9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a9b0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a9c0: 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74  pc+2], size-nByt
a9d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
a9e0: 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d  turn pc + size -
a9f0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
aa00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
aa10: 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d  addr = pc;.    }
aa20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
aa30: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
aa40: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
aa50: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
aa60: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
aa70: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
aa80: 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20  ent area..  */. 
aa90: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
aaa0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
aab0: 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
aac0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
aad0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
aae0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
aaf0: 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  t;.  if( nFrag>=
ab00: 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74  60 || cellOffset
ab10: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70   + 2*nCell > top
ab20: 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20   - nByte ){.    
ab30: 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61  if( defragmentPa
ab40: 67 65 28 70 50 61 67 65 29 20 29 20 72 65 74 75  ge(pPage) ) retu
ab50: 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20  rn 0;.    top = 
ab60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
ab70: 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f  dr+5]);.  }.  to
ab80: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73  p -= nByte;.  as
ab90: 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74  sert( cellOffset
aba0: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f   + 2*nCell <= to
abb0: 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  p );.  put2byte(
abc0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
abd0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70  p);.  return top
abe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
abf0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
ac00: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
ac10: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
ac20: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
ac30: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
ac40: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
ac50: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
ac60: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
ac70: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
ac80: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
ac90: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
aca0: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
acb0: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
acc0: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
acd0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
ace0: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
acf0: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
ad00: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53 70  atic void freeSp
ad10: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ad20: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
ad30: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
ad40: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
ad50: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
ad60: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
ad70: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
ad80: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
ad90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
ada0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
adb0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
adc0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
add0: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
ade0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
adf0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
ae00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
ae10: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
ae20: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ae30: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69 7a  ize );.  if( siz
ae40: 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a  e<4 ) size = 4;.
ae50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
ae60: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
ae70: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
ae80: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
ae90: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
aea0: 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54  the SECURE_DELET
aeb0: 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  E .  ** option i
aec0: 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
aed0: 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d  pile-time */.  m
aee0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
aef0: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65  t], 0, size);.#e
af00: 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
af10: 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e  he space back in
af20: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
af30: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
af40: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
af50: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
af60: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
af70: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
af80: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
af90: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
afa0: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
afb0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
afc0: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
afd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
afe0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
aff0: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64  n>addr );.    ad
b000: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d  dr = pbegin;.  }
b010: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
b020: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
b030: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
b040: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
b050: 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d  addr || pbegin==
b060: 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  0 );.  put2byte(
b070: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61  &data[addr], sta
b080: 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  rt);.  put2byte(
b090: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62  &data[start], pb
b0a0: 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74  egin);.  put2byt
b0b0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d  e(&data[start+2]
b0c0: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  , size);.  pPage
b0d0: 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b  ->nFree += size;
b0e0: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
b0f0: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
b100: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
b110: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b120: 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  t + 1;.  while( 
b130: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
b140: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
b150: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
b160: 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20  ext, psize;.    
b170: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
b180: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
b190: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
b1a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b1b0: 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74  e-4 );.    pnext
b1c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b1d0: 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20  a[pbegin]);.    
b1e0: 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  psize = get2byte
b1f0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
b200: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
b210: 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d  n + psize + 3 >=
b220: 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e   pnext && pnext>
b230: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
b240: 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70  rag = pnext - (p
b250: 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20  begin+psize);.  
b260: 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67      assert( frag
b270: 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  <=data[pPage->hd
b280: 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20  rOffset+7] );.  
b290: 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e      data[pPage->
b2a0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20  hdrOffset+7] -= 
b2b0: 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32  frag;.      put2
b2c0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b2d0: 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61  n], get2byte(&da
b2e0: 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20  ta[pnext]));.   
b2f0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b300: 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65  a[pbegin+2], pne
b310: 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74  xt+get2byte(&dat
b320: 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67  a[pnext+2])-pbeg
b330: 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  in);.    }else{.
b340: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
b350: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
b360: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
b370: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
b380: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
b390: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
b3a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
b3b0: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
b3c0: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
b3d0: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
b3e0: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
b3f0: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
b400: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b410: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
b420: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
b430: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
b440: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b450: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b460: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
b470: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
b480: 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  p + get2byte(&da
b490: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a  ta[pbegin+2]));.
b4a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63    }.}../*.** Dec
b4b0: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
b4c0: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
b4d0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
b4e0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
b4f0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
b500: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
b510: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
b520: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
b530: 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64  tatic void decod
b540: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
b550: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
b560: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
b570: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
b580: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
b590: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
b5a0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b5b0: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
b5c0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
b5d0: 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  .  pPage->intKey
b5e0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28   = (flagByte & (
b5f0: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
b600: 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20  EAFDATA))!=0;.  
b610: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
b620: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
b630: 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a  F_ZERODATA)!=0;.
b640: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b650: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
b660: 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67  LEAF)!=0;.  pPag
b670: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
b680: 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66  = 4*(pPage->leaf
b690: 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  ==0);.  pBt = pP
b6a0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
b6b0: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
b6c0: 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70  EAFDATA ){.    p
b6d0: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
b6e0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   1;.    pPage->m
b6f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b700: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
b710: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b720: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
b730: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  lse{.    pPage->
b740: 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20  leafData = 0;.  
b750: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b760: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
b770: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
b780: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b790: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  nLocal;.  }.  pP
b7a0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21  age->hasData = !
b7b0: 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61  (pPage->zeroData
b7c0: 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61   || (!pPage->lea
b7d0: 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  f && pPage->leaf
b7e0: 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Data));.}../*.**
b7f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b800: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
b810: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
b820: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   block..**.** Th
b830: 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
b840: 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ter must be a po
b850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
b860: 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  Page which.** is
b870: 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
b880: 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e  he page being in
b890: 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
b8a0: 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72  root of a.** BTr
b8b0: 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74  ee has no parent
b8c0: 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74   and so for that
b8d0: 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d   page, pParent==
b8e0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  NULL..**.** Retu
b8f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
b900: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
b910: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
b920: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
b930: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
b940: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b950: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
b960: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
b970: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
b980: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
b990: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
b9a0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
b9b0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
b9c0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
b9d0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
b9e0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
b9f0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
ba00: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
ba10: 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d   initPage(.  Mem
ba20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
ba30: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
ba40: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
ba50: 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
ba60: 70 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a  pParent       /*
ba70: 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69   The parent.  Mi
ba80: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
ba90: 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
baa0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
bab0: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
bac0: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
bad0: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Data[] */.  int 
bae0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  hdr;           /
baf0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
bb00: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
bb10: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
bb20: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
bb30: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
bb40: 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61  aData */.  BtSha
bb50: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
bb60: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
bb70: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
bb80: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
bb90: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
bba0: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
bbb0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
bbc0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
bbd0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
bbe0: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
bbf0: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
bc00: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
bc10: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
bc20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
bc30: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
bc40: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
bc50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
bc60: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
bc70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bc80: 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20  rea */..  pBt = 
bc90: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
bca0: 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a  sert( pBt!=0 );.
bcb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
bcc0: 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  t==0 || pParent-
bcd0: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61  >pBt==pBt );.  a
bce0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
bcf0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
bd00: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
bd10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
bd20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
bd30: 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67  Data == &((unsig
bd40: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29  ned char*)pPage)
bd50: 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  [-pBt->pageSize]
bd60: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
bd70: 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e  >pParent!=pParen
bd80: 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61  t && (pPage->pPa
bd90: 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65  rent!=0 || pPage
bda0: 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20  ->isInit) ){.   
bdb0: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70   /* The parent p
bdc0: 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  age should never
bdd0: 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74   change unless t
bde0: 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  he file is corru
bdf0: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
be00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be10: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
be20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20  pPage->isInit ) 
be30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
be40: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
be50: 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61  Parent==0 && pPa
be60: 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70  rent!=0 ){.    p
be70: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
be80: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
be90: 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
bea0: 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
beb0: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
bec0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
bed0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
bee0: 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  ata;.  decodeFla
bef0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
bf00: 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  dr]);.  pPage->n
bf10: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
bf20: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
bf30: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
bf40: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
bf50: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
bf60: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
bf70: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
bf80: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bf90: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
bfa0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bfb0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
bfc0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bfd0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
bfe0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
bff0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
c000: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
c010: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
c020: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
c030: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
c040: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
c050: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c060: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
c070: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
c080: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
c090: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
c0a0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
c0b0: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
c0c0: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
c0d0: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
c0e0: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
c0f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c100: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
c110: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c120: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c130: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c140: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c150: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c160: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
c170: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
c180: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
c190: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
c1a0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
c1b0: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
c1c0: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
c1d0: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
c1e0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
c1f0: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
c200: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
c210: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c220: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
c230: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
c240: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
c250: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
c260: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
c270: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
c280: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
c290: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
c2a0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
c2b0: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
c2c0: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
c2d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c2e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c2f0: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
c300: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
c310: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
c320: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
c330: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
c340: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
c350: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
c360: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
c370: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
c380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c390: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
c3a0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c3b0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
c3c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c3d0: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
c3e0: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
c3f0: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
c400: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
c410: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
c420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c430: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
c440: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
c450: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
c460: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
c470: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
c480: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
c490: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68  ge->pBt;.  int h
c4a0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c4b0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72  ffset;.  int fir
c4c0: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
c4d0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
c4e0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
c4f0: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
c500: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
c510: 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  &data[pBt->pageS
c520: 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65  ize] == (unsigne
c530: 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b  d char*)pPage );
c540: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c550: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c560: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c570: 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  e) );.  memset(&
c580: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
c590: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c5a0: 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  hdr);.  data[hdr
c5b0: 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72  ] = flags;.  fir
c5c0: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c5d0: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c5e0: 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74  F)==0);.  memset
c5f0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
c600: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
c610: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
c620: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c630: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c640: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
c650: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
c660: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
c670: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
c680: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
c690: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c6a0: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
c6b0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
c6c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
c6d0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67  flow = 0;.  pPag
c6e0: 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
c6f0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
c700: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
c710: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Init = 1;.}../*.
c720: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
c730: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
c740: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
c750: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
c760: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
c770: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
c780: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
c790: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
c7a0: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
c7b0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
c7c0: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
c7d0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
c7e0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
c7f0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
c800: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
c810: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
c820: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
c830: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
c840: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
c850: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
c860: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
c870: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
c880: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
c890: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
c8a0: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
c8b0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
c8c0: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
c8d0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
c8e0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
c8f0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
c900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
c910: 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70  Page(BtShared *p
c920: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d  Bt, Pgno pgno, M
c930: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
c940: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 29 7b   int noContent){
c950: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
c960: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44  Page *pPage;.  D
c970: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
c980: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
c990: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
c9a0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
c9b0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
c9c0: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
c9d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
c9e0: 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28   rc;.  pPage = (
c9f0: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
ca00: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
ca10: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
ca20: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
ca30: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
ca40: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
ca50: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
ca60: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
ca70: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
ca80: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
ca90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
caa0: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
cab0: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a  1 ? 100 : 0;.  *
cac0: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
cad0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cae0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
caf0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cb00: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
cb10: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
cb20: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
cb30: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
cb40: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
cb50: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
cb60: 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29 20 61  o.** getPage() a
cb70: 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e 0a 2a  nd initPage()..*
cb80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
cb90: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
cba0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
cbb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
cbc0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
cbd0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
cbe0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cbf0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
cc00: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
cc10: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
cc20: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
cc30: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
cc40: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
cc50: 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  t     /* Parent 
cc60: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29  of the page */.)
cc70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
cc80: 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
cc90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cca0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
ccb0: 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  }.  rc = getPage
ccc0: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
ccd0: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
cce0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
ccf0: 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
cd00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
cd10: 69 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  initPage(*ppPage
cd20: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
cd30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cd40: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
cd50: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
cd60: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
cd70: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
cd80: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67  ior.** call to g
cd90: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
cda0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
cdb0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
cdc0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
cdd0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
cde0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
cdf0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ce00: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
ce10: 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61 44 61  ert( &pPage->aDa
ce20: 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ta[pPage->pBt->p
ce30: 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67  ageSize]==(unsig
ce40: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
ce50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
ce60: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
ce70: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
ce80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ce90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
cea0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
ceb0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
cec0: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
ced0: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
cee0: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
cef0: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
cf00: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
cf10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
cf20: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
cf30: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
cf40: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
cf50: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
cf60: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
cf70: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
cf80: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
cf90: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
cfa0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
cfb0: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
cfc0: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
cfd0: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
cfe0: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
cff0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
d000: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
d010: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
d020: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
d030: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
d040: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
d050: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
d060: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
d070: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
d080: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
d090: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
d0a0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
d0b0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
d0c0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d0d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
d0e0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
d0f0: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
d100: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d120: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
d130: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
d140: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
d150: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
d160: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
d170: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
d180: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d190: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
d1a0: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
d1b0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
d1c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
d1d0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
d1e0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
d1f0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
d200: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
d210: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
d220: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
d230: 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  it ){.    pPage-
d240: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
d250: 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
d260: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
d270: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
d280: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
d290: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
d2a0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
d2b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d2c0: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
d2d0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
d2e0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d2f0: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
d300: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
d310: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
d320: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
d330: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
d340: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
d350: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
d360: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20   called..*/.int 
d370: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
d380: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
d390: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
d3a0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
d3b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
d3c0: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
d3d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71 6c  .  sqlite3 *pSql
d3e0: 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 41 73  ite,       /* As
d3f0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
d400: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
d410: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
d420: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
d430: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
d440: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
d450: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d470: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  * Options */.){.
d480: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
d490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
d4a0: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
d4b0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
d4c0: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
d4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
d4e0: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
d4f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d500: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73  E_OK;.  int nRes
d510: 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  erve;.  unsigned
d520: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
d530: 31 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69 6e  100];.#if !defin
d540: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
d550: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
d560: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d570: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 63  OMIT_DISKIO).  c
d580: 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
d590: 2a 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66 0a  *pTsdro;.#endif.
d5a0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
d5b0: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
d5c0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
d5d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
d5e0: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
d5f0: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
d600: 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  d database. This
d610: 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20   symbol is only 
d620: 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a  required if.  **
d630: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
d640: 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75  hared-data or au
d650: 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65  tovacuum feature
d660: 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a  s are compiled .
d670: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69    ** into the li
d680: 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  brary..  */.#if 
d690: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d6a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d6b0: 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  E) || !defined(S
d6c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d6d0: 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20  ACUUM).  #ifdef 
d6e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
d6f0: 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69  RYDB.    const i
d700: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
d710: 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73    #else.    cons
d720: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
d730: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74  zFilename && !st
d740: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
d750: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23  ":memory:");.  #
d760: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
d770: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
d780: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
d790: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
d7a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d7b0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
d7c0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
d7d0: 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74  ONE;.  p->pSqlit
d7e0: 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 20 20  e = pSqlite;..  
d7f0: 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
d800: 6e 20 65 78 69 73 74 69 6e 67 20 42 74 72 65 65  n existing Btree
d810: 20 73 74 72 75 63 74 75 72 65 20 6f 70 65 6e 65   structure opene
d820: 64 20 6f 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e 20  d on zFilename. 
d830: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
d840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
d850: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
d860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d870: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 70 54 73 64  T_DISKIO).  pTsd
d880: 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  ro = sqlite3Thre
d890: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
d8a0: 3b 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d 3e  ;.  if( pTsdro->
d8b0: 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26 26  useSharedData &&
d8c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
d8d0: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 63 68  sMemdb ){.    ch
d8e0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
d8f0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
d900: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
d910: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ame);.    if( !z
d920: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
d930: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
d940: 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
d950: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
d960: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 42      }.    for(pB
d970: 74 3d 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65  t=pTsdro->pBtree
d980: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
d990: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
d9a0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
d9b0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  0 );.      if( 0
d9c0: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
d9d0: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
d9e0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
d9f0: 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20  ->pPager)) ){.  
da00: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
da10: 42 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 42  Bt;.        *ppB
da20: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  tree = p;.      
da30: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
da40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
da50: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
da60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
da70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
da80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
da90: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
daa0: 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  thname);.  }.#en
dab0: 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  dif..  /*.  ** T
dac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
dad0: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
dae0: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
daf0: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
db00: 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 69   are.  ** the ri
db10: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
db20: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
db30: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
db40: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 2a   that result.  *
db50: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
db60: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
db70: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
db80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  */.  assert( siz
db90: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
dba0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
dbb0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
dbc0: 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(u64)==8 || siz
dbd0: 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(u64)==4 );. 
dbe0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dbf0: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73  u32)==4 );.  ass
dc00: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
dc10: 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
dc20: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
dc30: 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71 6c   );..  pBt = sql
dc40: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
dc50: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66 28  f(*pBt) );.  if(
dc60: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pBt==0 ){.    r
dc70: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
dc80: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65  ;.    goto btree
dc90: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20  _open_out;.  }. 
dca0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
dcb0: 65 72 4f 70 65 6e 28 26 70 42 74 2d 3e 70 50 61  erOpen(&pBt->pPa
dcc0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger, zFilename, 
dcd0: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
dce0: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
dcf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
dd00: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
dd10: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
dd20: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
dd30: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
dd40: 48 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 69  Header);.  }.  i
dd50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dd60: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 74 72   ){.    goto btr
dd70: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d  ee_open_out;.  }
dd80: 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b  .  p->pBt = pBt;
dd90: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
dda0: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42  SetDestructor(pB
ddb0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44  t->pPager, pageD
ddc0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 73 71  estructor);.  sq
ddd0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
dde0: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
ddf0: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
de00: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
de10: 20 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   0;.  pBt->pPage
de20: 31 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 72 65  1 = 0;.  pBt->re
de30: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
de40: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
de50: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
de60: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
de70: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
de80: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20  der[16]);.  if( 
de90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
dea0: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
deb0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
dec0: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 7c  GE_SIZE.       |
ded0: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
dee0: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
def0: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 42  ze)!=0 ){.    pB
df00: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  t->pageSize = SQ
df10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
df20: 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42 74 2d  E_SIZE;.    pBt-
df30: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20  >maxEmbedFrac = 
df40: 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a  64;   /* 25% */.
df50: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
df60: 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a  dFrac = 32;   /*
df70: 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 70 42   12.5% */.    pB
df80: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
df90: 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35 25   32;    /* 12.5%
dfa0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
dfb0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
dfc0: 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  UM.    /* If the
dfd0: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
dfe0: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
dff0: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
e000: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
e010: 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
e020: 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
e030: 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
e040: 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
e050: 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
e060: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e070: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
e080: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
e090: 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
e0a0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
e0b0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
e0c0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
e0d0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 2a   is just a.    *
e0e0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
e0f0: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
e100: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
e110: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
e120: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 2a 2f 0a   normal..    */.
e130: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
e140: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
e150: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
e160: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
e170: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e180: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
e190: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
e1a0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
e1b0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e1c0: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
e1d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e    }.#endif.    n
e1e0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d  Reserve = 0;.  }
e1f0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72  else{.    nReser
e200: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
e210: 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  0];.    pBt->max
e220: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
e230: 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70  eader[21];.    p
e240: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
e250: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d   = zDbHeader[22]
e260: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  ;.    pBt->minLe
e270: 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  afFrac = zDbHead
e280: 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d  er[23];.    pBt-
e290: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
e2a0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
e2b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
e2c0: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
e2d0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
e2e0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
e2f0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 4*4])?1:0);.#
e300: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d  endif.  }.  pBt-
e310: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
e320: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
e330: 65 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72 74  eserve;.  assert
e340: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
e350: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
e360: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
e370: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
e380: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e390: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
e3a0: 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67 65  Pager, pBt->page
e3b0: 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65 66  Size);..#if !def
e3c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e3d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e3e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e3f0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e400: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
e410: 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69 6e  btree to the lin
e420: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
e430: 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  g at ThreadData.
e440: 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68 65  pBtree..  ** The
e450: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
e460: 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20  that a malloc() 
e470: 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65 20  may fail inside 
e480: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71 6c  of the .  ** sql
e490: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e4a0: 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54 68   call, as the Th
e4b0: 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74 75  readData structu
e4c0: 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  re must have alr
e4d0: 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 61  eady.  ** been a
e4e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54 73  llocated for pTs
e4f0: 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61  dro->useSharedDa
e500: 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65 72  ta to be non-zer
e510: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  o..  */.  if( pT
e520: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
e530: 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ata && zFilename
e540: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
e550: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
e560: 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b   pTsdro->pBtree;
e570: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
e580: 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65 65  adData()->pBtree
e590: 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e 64   = pBt;.  }.#end
e5a0: 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  if.  pBt->nRef =
e5b0: 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d   1;.  *ppBtree =
e5c0: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
e5d0: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
e5e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e5f0: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
e600: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
e610: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
e620: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
e630: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e640: 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  Free(pBt);.    s
e650: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
e660: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
e670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e690: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
e6a0: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
e6b0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
e6c0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e6d0: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
e6e0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e6f0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
e700: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69  ursor *pCur;..#i
e710: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e720: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
e730: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
e740: 64 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  d;.#endif..  /* 
e750: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
e760: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
e770: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
e780: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
e790: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
e7a0: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
e7b0: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
e7c0: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
e7d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
e7e0: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
e7f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e800: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
e810: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
e820: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
e830: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
e840: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
e850: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
e860: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
e870: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
e880: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
e890: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
e8a0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
e8b0: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
e8c0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
e8d0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
e8e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
e8f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e900: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
e910: 48 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  HE.  /* If there
e920: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
e930: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
e940: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
e950: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
e960: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
e970: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
e980: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
e990: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
e9a0: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
e9b0: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
e9c0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
e9d0: 65 66 3e 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e  ef>0 );.  pBt->n
e9e0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
e9f0: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 72 65  ->nRef ){.    re
ea00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ea10: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
ea20: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
ea30: 65 20 66 72 6f 6d 20 74 68 65 20 74 68 72 65 61  e from the threa
ea40: 64 20 77 69 64 65 20 6c 69 73 74 2e 20 43 61 6c  d wide list. Cal
ea50: 6c 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  l .  ** ThreadDa
ea60: 74 61 52 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64  taReadOnly() and
ea70: 20 74 68 65 6e 20 63 61 73 74 20 61 77 61 79 20   then cast away 
ea80: 74 68 65 20 63 6f 6e 73 74 20 70 72 6f 70 65 72  the const proper
ea90: 74 79 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ty of the .  ** 
eaa0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64  pointer to avoid
eab0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 72 65   allocating thre
eac0: 61 64 20 64 61 74 61 20 69 66 20 69 74 20 69 73  ad data if it is
ead0: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 72 65 71 75   not really requ
eae0: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73  ired..  */.  pTs
eaf0: 64 20 3d 20 28 54 68 72 65 61 64 44 61 74 61 20  d = (ThreadData 
eb00: 2a 29 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  *)sqlite3ThreadD
eb10: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
eb20: 20 69 66 28 20 70 54 73 64 2d 3e 70 42 74 72 65   if( pTsd->pBtre
eb30: 65 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 61 73  e==pBt ){.    as
eb40: 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69  sert( pTsd==sqli
eb50: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
eb60: 29 3b 0a 20 20 20 20 70 54 73 64 2d 3e 70 42 74  );.    pTsd->pBt
eb70: 72 65 65 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ree = pBt->pNext
eb80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42  ;.  }else{.    B
eb90: 74 53 68 61 72 65 64 20 2a 70 50 72 65 76 3b 0a  tShared *pPrev;.
eba0: 20 20 20 20 66 6f 72 28 70 50 72 65 76 3d 70 54      for(pPrev=pT
ebb0: 73 64 2d 3e 70 42 74 72 65 65 3b 20 70 50 72 65  sd->pBtree; pPre
ebc0: 76 20 26 26 20 70 50 72 65 76 2d 3e 70 4e 65 78  v && pPrev->pNex
ebd0: 74 21 3d 70 42 74 3b 20 70 50 72 65 76 3d 70 50  t!=pBt; pPrev=pP
ebe0: 72 65 76 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  rev->pNext){}.  
ebf0: 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20    if( pPrev ){. 
ec00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73       assert( pTs
ec10: 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64  d==sqlite3Thread
ec20: 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 20 20  Data() );.      
ec30: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
ec40: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
ec50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
ec60: 2a 20 43 6c 6f 73 65 20 74 68 65 20 70 61 67 65  * Close the page
ec70: 72 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 73  r and free the s
ec80: 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
ec90: 63 74 75 72 65 20 2a 2f 0a 20 20 61 73 73 65 72  cture */.  asser
eca0: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
ecb0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
ecc0: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
ecd0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  ger);.  if( pBt-
ece0: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
ecf0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
ed00: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
ed10: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
ed20: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
ed30: 46 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d  Free(pBt->pSchem
ed40: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
ed50: 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
ed60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ed70: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62  .** Change the b
ed80: 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy handler call
ed90: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  back function..*
eda0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
edb0: 65 65 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72  eeSetBusyHandler
edc0: 28 42 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48  (Btree *p, BusyH
edd0: 61 6e 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72  andler *pHandler
ede0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
edf0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70  Bt = p->pBt;.  p
ee00: 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  Bt->pBusyHandler
ee10: 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73   = pHandler;.  s
ee20: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
ee30: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
ee40: 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29  Pager, pHandler)
ee50: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ee60: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ee70: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
ee80: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
ee90: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
eea0: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
eeb0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
eec0: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
eed0: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
eee0: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
eef0: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
ef00: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
ef10: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
ef20: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
ef30: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
ef40: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
ef50: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
ef60: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
ef70: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
ef80: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
ef90: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
efa0: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
efb0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
efc0: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
efd0: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
efe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
eff0: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
f000: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
f010: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
f020: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
f030: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
f040: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
f050: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
f060: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
f070: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
f080: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
f090: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
f0a0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
f0b0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
f0c0: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
f0d0: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
f0e0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
f0f0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f100: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
f110: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
f120: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f130: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
f140: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
f150: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
f160: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f170: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
f180: 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
f190: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
f1a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f1b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f1c0: 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
f1d0: 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
f1e0: 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
f1f0: 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
f200: 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
f210: 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
f220: 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
f230: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
f240: 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
f250: 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
f260: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
f270: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
f280: 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
f290: 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
f2a0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
f2b0: 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
f2c0: 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
f2d0: 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
f2e0: 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
f2f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
f300: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
f310: 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
f320: 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
f330: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
f340: 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
f350: 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
f360: 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
f370: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
f380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
f390: 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
f3a0: 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65  ite3BtreeSetSafe
f3b0: 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70  tyLevel(Btree *p
f3c0: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
f3d0: 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74   fullSync){.  Bt
f3e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
f3f0: 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  >pBt;.  sqlite3P
f400: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
f410: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
f420: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
f430: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f440: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
f450: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f460: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
f470: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
f480: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
f490: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
f4a0: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
f4b0: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
f4c0: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
f4d0: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
f4e0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
f4f0: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
f500: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f510: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
f520: 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
f530: 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 65 74  >pPager );.  ret
f540: 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
f550: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
f560: 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  er);.}..#if !def
f570: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f580: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
f590: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
f5a0: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
f5b0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
f5c0: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
f5d0: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
f5e0: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
f5f0: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
f600: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
f610: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
f620: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
f630: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
f640: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
f650: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
f660: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
f670: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
f680: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
f690: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
f6a0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
f6b0: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
f6c0: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
f6d0: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
f6e0: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
f6f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f700: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
f710: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
f720: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
f730: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
f740: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
f750: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
f760: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
f770: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
f780: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
f790: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
f7a0: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
f7b0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
f7c0: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
f7d0: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
f7e0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
f7f0: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
f800: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f810: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
f820: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
f830: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
f840: 73 65 72 76 65 29 7b 0a 20 20 42 74 53 68 61 72  serve){.  BtShar
f850: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
f860: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
f870: 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
f880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f890: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
f8a0: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
f8b0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
f8c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
f8d0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f8e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
f8f0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
f900: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
f910: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
f920: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
f930: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
f940: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
f950: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
f960: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
f970: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
f980: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
f990: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
f9a0: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Size = sqlite3Pa
f9b0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f9c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
f9d0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
f9e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f9f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
fa00: 52 65 73 65 72 76 65 3b 0a 20 20 72 65 74 75 72  Reserve;.  retur
fa10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fa20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
fa30: 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
fa40: 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
fa50: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
fa60: 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
fa70: 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
fa80: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
fa90: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
faa0: 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
fab0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
fac0: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
fad0: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
fae0: 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ableSize;.}.#end
faf0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
fb00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
fb10: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
fb20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fb30: 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
fb40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
fb50: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
fb60: 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
fb70: 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
fb80: 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
fb90: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
fba0: 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
fbb0: 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
fbc0: 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
fbd0: 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
fbe0: 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
fbf0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
fc00: 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
fc10: 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
fc20: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
fc30: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
fc40: 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
fc50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
fc60: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
fc70: 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
fc80: 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
fc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
fca0: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
fcb0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
fcc0: 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
fcd0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fce0: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
fcf0: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 69  Vacuum?1:0);.  i
fd00: 6e 74 20 69 76 20 3d 20 28 61 75 74 6f 56 61 63  nt iv = (autoVac
fd10: 75 75 6d 3d 3d 42 54 52 45 45 5f 41 55 54 4f 56  uum==BTREE_AUTOV
fd20: 41 43 55 55 4d 5f 49 4e 43 52 3f 31 3a 30 29 3b  ACUUM_INCR?1:0);
fd30: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
fd40: 53 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21  SizeFixed && av!
fd50: 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
fd60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fd70: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
fd80: 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f 56    }.  pBt->autoV
fd90: 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 70 42  acuum = av;.  pB
fda0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
fdb0: 69 76 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  iv;.  return SQL
fdc0: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  ITE_OK;.#endif.}
fdd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
fde0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
fdf0: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
fe00: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
fe10: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
fe20: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
fe30: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
fe40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe50: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
fe60: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
fe70: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
fe80: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
fe90: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
fea0: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
feb0: 65 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20  e.  return (.   
fec0: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
fed0: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
fee0: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
fef0: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
ff00: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
ff10: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
ff20: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
ff30: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 23 65  UUM_INCR.  );.#e
ff40: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
ff50: 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
ff60: 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
ff70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
ff80: 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
ff90: 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
ffa0: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
ffb0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
ffc0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
ffd0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
ffe0: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
fff0: 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
10000 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
10010 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
10020 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
10030 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
10040 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
10050 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
10060 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
10070 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
10080 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
10090 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
100a0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
100b0 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
100c0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70  Bt){.  int rc, p
100d0 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61  ageSize;.  MemPa
100e0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 66  ge *pPage1;.  if
100f0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20  ( pBt->pPage1 ) 
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10110 3b 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  ;.  rc = getPage
10120 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
10130 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
10140 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
10150 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20  rn rc;.  ..  /* 
10160 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
10170 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
10180 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
10190 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
101a0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
101b0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
101c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
101d0 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ADB;.  if( sqlit
101e0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
101f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20  (pBt->pPager)>0 
10200 29 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  ){.    u8 *page1
10210 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
10220 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
10230 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
10240 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
10250 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
10260 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10270 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
10280 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
10290 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
102a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
102b0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
102c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
102d0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
102e0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
102f0 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61  e = get2byte(&pa
10300 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  ge1[16]);.    if
10310 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
10320 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20  pageSize)!=0 || 
10330 70 61 67 65 53 69 7a 65 3c 35 31 32 20 29 7b 0a  pageSize<512 ){.
10340 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
10350 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10360 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
10370 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
10380 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  0 );.    pBt->pa
10390 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
103a0 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
103b0 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
103c0 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
103d0 20 20 20 69 66 28 20 70 42 74 2d 3e 75 73 61 62     if( pBt->usab
103e0 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
103f0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
10400 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
10410 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  }.    pBt->maxEm
10420 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
10430 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  21];.    pBt->mi
10440 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  nEmbedFrac = pag
10450 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[22];.    pBt-
10460 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70  >minLeafFrac = p
10470 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65  age1[23];.#ifnde
10480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10490 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
104a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
104b0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
104c0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
104d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
104e0 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
104f0 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
10500 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
10510 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
10520 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
10530 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
10540 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
10550 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
10560 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
10570 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
10580 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
10590 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
105a0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
105b0 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
105c0 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
105d0 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
105e0 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
105f0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
10600 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10610 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
10620 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
10630 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
10640 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
10650 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
10660 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
10670 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
10680 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
10690 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
106a0 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
106b0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
106c0 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
106d0 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
106e0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
106f0 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
10700 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
10710 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
10720 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
10730 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
10740 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
10750 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72  *pBt->maxEmbedFr
10760 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
10770 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
10780 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
10790 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  12)*pBt->minEmbe
107a0 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
107b0 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
107c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
107d0 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
107e0 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
107f0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74  ableSize-12)*pBt
10800 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35  ->minLeafFrac/25
10810 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42  5 - 23;.  if( pB
10820 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d  t->minLocal>pBt-
10830 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74  >maxLocal || pBt
10840 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a  ->maxLocal<0 ){.
10850 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
10860 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  nit_failed;.  }.
10870 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
10880 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
10890 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
108a0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
108b0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
108c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
108d0 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
108e0 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
108f0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
10900 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10920 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10930 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b   works like lock
10940 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74  Btree() except t
10950 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f  hat it also invo
10960 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20  kes the.** busy 
10970 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72  callback if ther
10980 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e is lock conten
10990 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
109a0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  int lockBtreeWit
109b0 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52  hRetry(Btree *pR
109c0 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ef){.  int rc = 
109d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
109e0 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
109f0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
10a00 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
10a10 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
10a20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10a30 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
10a40 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
10a50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
10a60 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
10a70 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
10a80 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10a90 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
10aa0 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
10ab0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
10ac0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10ae0 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
10af0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
10b00 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
10b10 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
10b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
10b30 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
10b40 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
10b50 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10b60 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
10b70 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
10b80 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10b90 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
10ba0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
10bb0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
10bc0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
10bd0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
10be0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
10bf0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
10c00 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
10c10 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
10c20 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
10c30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10c40 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
10c50 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
10c60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10c70 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
10c80 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
10c90 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
10ca0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10cb0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10cc0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
10cd0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
10ce0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10cf0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
10d00 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
10d10 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72  ONE && pBt->pCur
10d20 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70  sor==0 && pBt->p
10d30 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
10d40 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
10d50 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
10d60 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20  ager)>=1 ){.    
10d70 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
10d80 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
10d90 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
10da0 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
10db0 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
10dc0 67 65 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75  ge->aData = &((u
10dd0 38 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e  8*)pPage)[-pBt->
10de0 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20  pageSize];.     
10df0 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
10e00 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61  pBt;.        pPa
10e10 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ge->pgno = 1;.  
10e20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
10e30 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
10e40 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
10e50 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
10e60 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
10e70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
10e80 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
10e90 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
10ea0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
10eb0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
10ec0 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
10ed0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
10ee0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10ef0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
10f00 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
10f10 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
10f20 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  c;.  if( sqlite3
10f30 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
10f40 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20  Bt->pPager)>0 ) 
10f50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10f60 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  ;.  pP1 = pBt->p
10f70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
10f80 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
10f90 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
10fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10fb0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
10fc0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
10fd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
10fe0 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
10ff0 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
11000 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
11010 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
11020 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
11030 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
11040 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
11050 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
11060 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
11070 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
11080 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
11090 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
110a0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
110b0 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61  ta[21] = pBt->ma
110c0 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61  xEmbedFrac;.  da
110d0 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69  ta[22] = pBt->mi
110e0 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61  nEmbedFrac;.  da
110f0 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69  ta[23] = pBt->mi
11100 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d  nLeafFrac;.  mem
11110 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
11120 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
11130 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
11140 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
11150 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
11160 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11170 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
11180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11190 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
111a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
111b0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
111c0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
111d0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
111e0 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
111f0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  utoVacuum);.#end
11200 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
11210 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11220 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
11230 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
11240 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
11250 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
11260 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
11270 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
11280 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
11290 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
112a0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
112b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
112c0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
112d0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
112e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
112f0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
11300 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
11310 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
11320 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
11330 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
11340 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
11350 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
11360 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
11370 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
11380 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
11390 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
113a0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
113b0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
113c0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
113d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
113e0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
113f0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
11400 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
11410 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
11420 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
11430 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
11440 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11450 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
11460 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
11470 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11480 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
11490 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
114a0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
114b0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
114c0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
114d0 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
114e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
114f0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11500 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
11510 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11520 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
11530 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
11540 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
11550 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
11560 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
11570 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
11580 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
11590 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
115a0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
115b0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
115c0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
115d0 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
115e0 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
115f0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
11600 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
11610 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
11620 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
11630 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
11640 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
11650 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
11660 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
11670 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
11680 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
11690 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
116a0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
116b0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
116c0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
116d0 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
116e0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
116f0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
11700 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
11710 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
11720 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
11730 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
11740 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
11750 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
11760 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
11770 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
11780 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
11790 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
117a0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
117b0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
117c0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
117d0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
117e0 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
117f0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
11800 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
11810 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
11820 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
11830 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
11840 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
11850 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
11860 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
11870 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
11880 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
11890 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
118a0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
118b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
118c0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
118d0 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
118e0 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
118f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11900 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11910 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  OK;..  btreeInte
11920 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
11930 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
11940 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
11950 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
11960 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
11970 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
11980 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
11990 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
119a0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
119b0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
119c0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
119d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
119e0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
119f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11a00 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
11a10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11a30 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
11a40 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
11a50 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
11a60 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
11a70 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
11a80 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
11a90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11aa0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11ab0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f    }..  /* If ano
11ac0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
11ad0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
11ae0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
11af0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
11b00 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
11b10 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
11b20 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
11b30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
11b40 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
11b50 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
11b60 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  _BUSY..  */.  if
11b70 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
11b80 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
11b90 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  E && wrflag ){. 
11ba0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11bb0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f  _BUSY;.  }..  do
11bc0 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   {.    if( pBt->
11bd0 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
11be0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
11bf0 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  e(pBt);.    }.. 
11c00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11c10 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
11c20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
11c30 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
11c40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11c50 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
11c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11c70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11c80 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
11c90 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
11ca0 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
11cb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
11cd0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
11ce0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
11cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11d00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11d20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
11d30 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
11d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
11d50 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11d60 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
11d70 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11d80 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
11d90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11da0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
11db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
11dc0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11dd0 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c  (pBt->pBusyHandl
11de0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  er) );..  if( rc
11df0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11e00 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11e10 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
11e20 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
11e30 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
11e40 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
11e50 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
11e60 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
11e70 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
11e80 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
11e90 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
11ea0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
11eb0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
11ec0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ns;.    }.  }.. 
11ed0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
11ee0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11ef0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11f00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11f10 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
11f20 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
11f30 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
11f40 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
11f50 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
11f60 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
11f70 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
11f80 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
11f90 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
11fa0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
11fb0 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
11fc0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
11fd0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
11fe0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
11ff0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
12000 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
12030 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
12040 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12070 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
12080 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
12090 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
120c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
120d0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
120e0 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
120f0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
12100 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
12110 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69  ge->pgno;..  ini
12120 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
12130 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
12140 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
12150 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
12160 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
12170 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
12180 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
12190 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
121a0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
121b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
121c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
121d0 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
121e0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
121f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12200 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
12210 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
12220 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
12230 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
12240 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
12250 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
12260 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
12270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12280 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
12290 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
122a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
122b0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
122c0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
122d0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
122e0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
122f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12300 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
12310 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12320 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12330 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12340 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
12350 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
12360 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
12370 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
12380 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12390 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
123a0 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
123b0 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  enteed to be a b
123c0 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
123d0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
123e0 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
123f0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12400 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
12410 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
12420 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
12430 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
12440 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
12450 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
12460 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
12470 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
12480 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
12490 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
124a0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
124b0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
124c0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
124f0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12500 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
12510 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
12520 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12530 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
12540 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
12550 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
12560 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
12570 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
12580 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
12590 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
125a0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
125b0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
125c0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
125d0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
125e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
125f0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12600 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
12610 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
12620 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
12630 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
12640 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
12650 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54  eType){.  if( eT
12660 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
12670 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
12680 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
12690 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
126a0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
126b0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
126c0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
126d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
126e0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
126f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12700 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12710 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
12720 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12730 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
12740 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
12750 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
12760 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
12770 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
12780 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
12790 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
127a0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
127b0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
127c0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
127d0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
127e0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
127f0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12800 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12810 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12820 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12830 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
12840 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
12850 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
12860 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
12870 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
12880 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
12890 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
128a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
128b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
128c0 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
128d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
128e0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
128f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12920 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
12930 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
12940 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
12950 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
12960 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12970 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12990 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
129a0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
129b0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
129c0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
129d0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
129e0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
129f0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
12a00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
12a10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12a20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
12a30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12a40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
12a50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
12a60 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
12a70 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12a80 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12aa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12ab0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
12ac0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
12ad0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
12ae0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
12af0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
12b00 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
12b10 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
12b20 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
12b30 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
12b40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12b50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
12b60 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
12b70 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
12b80 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
12b90 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
12ba0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
12bb0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12bc0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
12bd0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
12be0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
12bf0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12c00 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
12c10 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
12c20 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12c30 20 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20   iFreePage      
12c40 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
12c50 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
12c60 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  Page to */.){.  
12c70 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
12c80 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
12c90 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
12ca0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
12cb0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
12cc0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
12cd0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
12ce0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
12cf0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
12d00 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
12d10 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12d20 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
12d30 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
12d40 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
12d50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
12d60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
12d70 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d  TPAGE );..  /* M
12d80 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
12d90 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65   from it's curre
12da0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
12db0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
12dc0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
12dd0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
12de0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
12df0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
12e00 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
12e10 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
12e20 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
12e30 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
12e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12e50 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
12e60 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
12e70 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29  Page, iFreePage)
12e80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12e90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
12ea0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
12eb0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
12ec0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
12ed0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
12ee0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
12ef0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
12f00 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
12f10 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
12f20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
12f30 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
12f40 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
12f50 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
12f60 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
12f70 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
12f80 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
12f90 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
12fa0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
12fb0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
12fc0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
12fd0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
12fe0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
12ff0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
13000 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
13010 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
13020 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
13030 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
13040 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
13050 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
13060 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
13070 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
13080 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13090 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
130a0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
130b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
130c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
130d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
130e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
130f0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
13100 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
13110 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
13120 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
13130 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
13140 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
13150 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
13160 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
13170 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
13180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
131a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
131b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
131c0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
131d0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
131e0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
131f0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
13200 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
13210 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
13220 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
13230 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
13240 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
13250 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
13260 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
13270 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
13280 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
13290 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
132a0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
132b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
132c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
132d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
132e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
132f0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
13300 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
13310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13320 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13330 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
13340 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13350 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
13360 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
13370 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
13380 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
13390 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
133a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
133b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
133c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
133d0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
133e0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
133f0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
13400 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
13410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13420 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
13430 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
13440 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
13450 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
13460 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
13470 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
13480 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
13490 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
134a0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
134b0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
134c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
134d0 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
134e0 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
134f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
13500 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
13510 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
13520 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
13530 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
13540 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
13550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
13560 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
13570 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
13580 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
13590 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
135a0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
135b0 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
135c0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
135d0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
135e0 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
135f0 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
13600 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
13610 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
13620 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65  -zero, the imple
13630 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
13640 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
13650 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
13660 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
13670 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
13680 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
13690 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
136a0 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
136b0 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
136c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
136d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
136e0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
136f0 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
13700 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  ss is complete..
13710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
13720 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
13730 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
13740 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69   nFin){.  Pgno i
13750 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20 20 20  LastPg;         
13760 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65      /* Last page
13770 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13780 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65   */.  Pgno nFree
13790 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
137a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
137b0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
137c0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
137d0 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e  iLastPg = pBt->n
137e0 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61  Trunc;.  if( iLa
137f0 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  stPg==0 ){.    i
13800 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74 65 33  LastPg = sqlite3
13810 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13820 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
13830 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
13840 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
13850 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
13860 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
13870 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
13880 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
13890 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
138a0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
138b0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
138c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
138d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
138e0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
138f0 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50   || nFin==iLastP
13900 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
13910 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
13920 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
13930 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
13940 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
13950 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
13960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13970 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13980 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
13990 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
139a0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
139b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
139c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
139d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
139e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
139f0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
13a00 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13a10 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
13a20 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
13a30 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
13a40 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
13a50 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
13a60 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
13a70 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63  -zero. In this c
13a80 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
13a90 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
13aa0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
13ab0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
13ac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13ad0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
13ae0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
13af0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
13b00 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
13b10 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
13b20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13b30 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
13b40 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
13b50 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
13b60 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
13b70 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
13b80 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
13b90 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
13ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13bc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13bd0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13be0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
13bf0 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
13c00 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13c10 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
13c20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
13c30 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
13c40 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
13c50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13c60 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
13c70 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
13c80 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
13c90 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
13ca0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
13cb0 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
13cc0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
13cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13cf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
13d00 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20       /* If nFin 
13d10 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
13d20 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
13d30 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
13d40 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
13d50 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
13d60 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
13d70 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
13d80 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
13d90 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
13da0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
13db0 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65  , if nFin is gre
13dc0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
13dd0 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
13de0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
13df0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
13e00 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
13e10 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
13e20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
13e30 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
13e40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
13e50 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
13e60 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
13e70 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
13e80 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
13e90 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
13ea0 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eePg, 0, 0);.   
13eb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13ed0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13ee0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
13ef0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13f10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
13f20 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
13f30 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20  ile( nFin!=0 && 
13f40 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
13f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
13f60 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
13f70 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
13f80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
13f90 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44  rite(pLastPg->pD
13fa0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
13fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13fc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13fd0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20  n rc;.      } . 
13fe0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
13ff0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
14000 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
14010 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a  Page, iFreePg);.
14020 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14030 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
14040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
14060 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14070 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  } .    }.  }..  
14080 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c  pBt->nTrunc = iL
14090 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69  astPg - 1;.  whi
140a0 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  le( pBt->nTrunc=
140b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
140c0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
140d0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
140e0 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20  >nTrunc) ){.    
140f0 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20  pBt->nTrunc--;. 
14100 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14110 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14120 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
14130 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
14140 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
14150 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
14160 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
14170 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
14180 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
14190 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
141a0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
141b0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
141c0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
141d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
141e0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
141f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
14200 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
14210 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
14220 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
14230 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  cured,.** SQLITE
14240 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
14250 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
14260 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
14270 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
14280 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
14290 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
142a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
142b0 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
142c0 2a 70 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74  *pCur;..  assert
142d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
142e0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
142f0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
14300 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
14310 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
14320 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65  Vacuum ){.    re
14330 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
14340 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
14350 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
14360 4f 42 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  OB.  for(pCur=pB
14370 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
14380 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
14390 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 65 6c 65  xt){.    /* Dele
143a0 74 65 20 74 68 65 20 63 61 63 68 65 20 6f 66 20  te the cache of 
143b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
143c0 6d 62 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71  mbers. */.    sq
143d0 6c 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e 61  liteFree(pCur->a
143e0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 70  Overflow);.    p
143f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
14400 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
14410 20 72 65 74 75 72 6e 20 69 6e 63 72 56 61 63 75   return incrVacu
14420 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a  umStep(pBt, 0);.
14430 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14440 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14450 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
14460 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
14470 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
14480 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f  * is commited fo
14490 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
144a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
144b0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
144c0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
144d0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
144e0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
144f0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
14500 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
14510 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
14520 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
14530 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
14540 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
14550 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
14560 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
14570 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
14580 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
14590 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
145a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
145b0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
145c0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
145d0 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e   *pnTrunc){.  in
145e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
145f0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14600 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
14610 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14620 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c    int nRef = sql
14630 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
14640 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69  t(pPager);.#endi
14650 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
14660 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
14670 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
14680 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
14690 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
146a0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
146b0 74 29 7b 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74  t){.    /* Delet
146c0 65 20 74 68 65 20 63 61 63 68 65 20 6f 66 20 6f  e the cache of o
146d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
146e0 62 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  bers. */.    sql
146f0 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e 61 4f  iteFree(pCur->aO
14700 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 70 43  verflow);.    pC
14710 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
14720 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
14730 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
14740 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
14750 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
14760 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
14770 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  n = 0;..    if( 
14780 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29  pBt->nTrunc==0 )
14790 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72  {.      Pgno nFr
147a0 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e  ee;.      Pgno n
147b0 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f  Ptrmap;.      co
147c0 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
147d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  Bt->pageSize;.  
147e0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
147f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
14800 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
14810 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  er);..      if( 
14820 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
14830 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20  t, nOrig) ){.   
14840 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14850 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14870 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  f( nOrig==PENDIN
14880 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
14890 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69   ){.        nOri
148a0 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
148b0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
148c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
148d0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
148e0 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
148f0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
14900 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
14910 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
14920 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69  sz/5);.      nFi
14930 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
14940 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
14950 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
14960 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
14970 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e  Bt) && nFin<=PEN
14980 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
14990 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
149a0 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
149b0 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d       while( PTRM
149c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
149d0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
149e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
149f0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
14a00 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
14a10 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
14a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
14a40 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
14a50 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
14a60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14a70 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14a80 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c  assert(nFin==0 |
14a90 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  | pBt->nTrunc==0
14aa0 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e   || nFin<=pBt->n
14ab0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63  Trunc);.      rc
14ac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14ad0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
14ae0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
14af0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
14b00 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
14b10 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
14b20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
14b30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
14b40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
14b50 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
14b60 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
14b70 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
14b80 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a  >nTrunc = nFin;.
14b90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14ba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14bc0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
14bd0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
14be0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
14bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14c00 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d   *pnTrunc = pBt-
14c10 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74  >nTrunc;.    pBt
14c20 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  ->nTrunc = 0;.  
14c30 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  }.  assert( nRef
14c40 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ==sqlite3PagerRe
14c50 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
14c60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14c70 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ..#endif../*.** 
14c80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
14c90 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
14ca0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
14cb0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
14cc0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
14cd0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
14ce0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
14cf0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
14d00 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
14d10 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
14d20 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
14d30 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
14d40 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
14d50 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
14d60 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
14d70 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
14d80 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
14d90 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
14da0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
14db0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
14dc0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
14dd0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
14de0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
14df0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
14e00 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
14e10 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
14e20 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
14e30 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
14e40 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
14e50 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
14e60 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
14e70 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
14e80 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
14e90 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14ea0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
14eb0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
14ec0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
14ed0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
14ee0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
14ef0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
14f00 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
14f10 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14f20 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  t() for the seco
14f30 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
14f40 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
14f50 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
14f60 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
14f70 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
14f80 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
14f90 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
14fa0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
14fb0 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
14fc0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
14fd0 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
14fe0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
14ff0 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
15000 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
15010 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
15020 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
15030 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
15040 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
15050 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
15060 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
15070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
15080 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
15090 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
150a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
150b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
150c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
150d0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
150e0 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
150f0 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
15100 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
15110 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
15120 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
15130 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
15140 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
15150 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
15160 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
15170 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
15180 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15190 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
151a0 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
151b0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
151c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
151d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
151e0 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
151f0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
15200 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
15220 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15230 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
15240 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15250 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  >pBt;.    Pgno n
15260 54 72 75 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64  Trunc = 0;.#ifnd
15270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15280 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
15290 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
152a0 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
152b0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
152c0 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20  (pBt, &nTrunc); 
152d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
152e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
152f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
15310 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
15320 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
15330 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
15340 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
15350 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runc);.  }.  ret
15360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15370 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
15380 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
15390 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
153a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
153b0 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
153c0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
153d0 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
153e0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
153f0 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
15400 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
15410 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
15420 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
15430 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
15440 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
15450 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
15460 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
15470 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68  ne did.** all th
15480 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
15490 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
154a0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
154b0 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
154c0 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
154d0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
154e0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
154f0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
15500 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
15510 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
15520 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
15530 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15540 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65  .** (which cause
15550 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
15560 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
15570 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
15580 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
15590 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
155a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
155b0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
155c0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
155d0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
155e0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
155f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
15600 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15610 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
15620 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
15630 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15640 70 42 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  pBt;..  btreeInt
15650 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
15660 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
15670 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
15680 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
15690 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
156a0 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
156b0 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
156c0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
156d0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
156e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
156f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
15700 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
15710 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
15720 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15730 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
15740 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
15750 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
15760 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
15770 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
15780 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
15790 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
157a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
157b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
157c0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
157d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
157e0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70  RANS_READ;.    p
157f0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
15800 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54    }.  unlockAllT
15810 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20  ables(p);..  /* 
15820 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15830 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
15840 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
15850 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
15860 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
15870 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
15880 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
15890 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
158a0 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
158b0 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
158c0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
158d0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
158e0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
158f0 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
15900 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
15910 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
15920 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
15930 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
15940 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15950 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
15960 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
15970 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
15980 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15990 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
159a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
159b0 20 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72   the handles cur
159c0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
159d0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
159e0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a  NONE and unlock.
159f0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69    ** the pager i
15a00 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
15a10 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
15a20 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
15a30 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d  ction..  */.  p-
15a40 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
15a50 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42  _NONE;.  unlockB
15a60 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
15a70 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
15a80 72 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72  rity(p);.  retur
15a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15aa0 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
15ab0 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
15ac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15ad0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
15ae0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15af0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
15b00 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
15b10 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
15b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15b30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15b40 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15b50 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eTwo(p);.  }.  r
15b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15b70 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
15b80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
15b90 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72  ber of write-cur
15ba0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
15bb0 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69  s handle. This i
15bc0 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
15bd0 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
15be0 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
15bf0 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
15c00 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
15c10 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
15c20 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
15c30 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
15c40 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
15c50 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
15c60 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
15c70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
15c80 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
15c90 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
15ca0 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
15cb0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
15cc0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
15cd0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
15ce0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
15cf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
15d00 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
15d10 64 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d  debugging inform
15d20 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
15d30 63 75 72 73 6f 72 73 20 74 6f 20 73 74 61 6e 64  cursors to stand
15d40 61 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76  ard output..*/.v
15d50 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
15d60 43 75 72 73 6f 72 4c 69 73 74 28 42 74 72 65 65  CursorList(Btree
15d70 20 2a 70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72   *p){.  BtCursor
15d80 20 2a 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72   *pCur;.  BtShar
15d90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15da0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
15db0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
15dc0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
15dd0 74 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  t){.    MemPage 
15de0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
15df0 50 61 67 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Page;.    char *
15e00 7a 4d 6f 64 65 20 3d 20 70 43 75 72 2d 3e 77 72  zMode = pCur->wr
15e10 46 6c 61 67 20 3f 20 22 72 77 22 20 3a 20 22 72  Flag ? "rw" : "r
15e20 6f 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  o";.    sqlite3D
15e30 65 62 75 67 50 72 69 6e 74 66 28 22 43 55 52 53  ebugPrintf("CURS
15e40 4f 52 20 25 70 20 72 6f 6f 74 65 64 20 61 74 20  OR %p rooted at 
15e50 25 34 64 28 25 73 29 20 63 75 72 72 65 6e 74 6c  %4d(%s) currentl
15e60 79 20 61 74 20 25 64 2e 25 64 25 73 5c 6e 22 2c  y at %d.%d%s\n",
15e70 0a 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43  .       pCur, pC
15e80 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a 4d  ur->pgnoRoot, zM
15e90 6f 64 65 2c 0a 20 20 20 20 20 20 20 70 50 61 67  ode,.       pPag
15ea0 65 20 3f 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e ? pPage->pgno 
15eb0 3a 20 30 2c 20 70 43 75 72 2d 3e 69 64 78 2c 0a  : 0, pCur->idx,.
15ec0 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 65 53         (pCur->eS
15ed0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
15ee0 49 44 29 20 3f 20 22 22 20 3a 20 22 20 65 6f 66  ID) ? "" : " eof
15ef0 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  ".    );.  }.}.#
15f00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  endif../*.** Rol
15f10 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
15f20 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
15f30 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
15f40 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
15f50 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
15f60 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
15f70 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
15f80 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
15f90 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
15fa0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
15fb0 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
15fc0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
15fd0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
15fe0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
15ff0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
16000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16010 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
16020 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
16030 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
16040 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
16050 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
16060 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
16070 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  k(Btree *p){.  i
16080 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
16090 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
160a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
160b0 65 31 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76 65  e1;..  rc = save
160c0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
160d0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
160e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
160f0 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
16100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16110 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
16120 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
16130 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
16140 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
16150 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
16160 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
16170 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
16180 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
16190 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
161a0 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
161b0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
161c0 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
161d0 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
161e0 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
161f0 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
16200 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
16210 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
16220 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
16230 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
16240 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
16250 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
16260 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
16270 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
16280 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
16290 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
162a0 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
162b0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
162c0 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
162d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
162e0 65 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  e( pBt->pCursor 
162f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16300 20 2a 64 62 20 3d 20 70 42 74 2d 3e 70 43 75 72   *db = pBt->pCur
16310 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71  sor->pBtree->pSq
16320 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  lite;.      if( 
16330 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  db ){.        sq
16340 6c 69 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41  lite3AbortOtherA
16350 63 74 69 76 65 56 64 62 65 73 28 64 62 2c 20 30  ctiveVdbes(db, 0
16360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74  .  }.#endif.  bt
16380 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
16390 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  .  unlockAllTabl
163a0 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  es(p);..  if( p-
163b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
163c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
163d0 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53   rc2;..#ifndef S
163e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
163f0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e  ACUUM.    pBt->n
16400 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69  Trunc = 0;.#endi
16410 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  f..    assert( T
16420 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
16430 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
16440 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
16450 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
16460 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
16470 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
16480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16490 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
164a0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
164b0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
164c0 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
164d0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
164e0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
164f0 67 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  getPage() on pag
16500 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
16510 65 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  e sure pPage1->a
16520 44 61 74 61 20 69 73 0a 20 20 20 20 2a 2a 20 73  Data is.    ** s
16530 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
16540 0a 20 20 20 20 69 66 28 20 67 65 74 50 61 67 65  .    if( getPage
16550 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
16560 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
16570 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
16580 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
16590 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
165a0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
165b0 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
165c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
165d0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
165e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
165f0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
16600 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
16610 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
16620 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
16630 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
16640 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
16650 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
16660 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
16670 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
16680 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
16690 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    }..  p->inTran
166a0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
166b0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
166c0 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
166d0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
166e0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
166f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
16710 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
16720 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
16730 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
16740 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72   can.** can be r
16750 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70  olled back indep
16760 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
16770 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
16780 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74  ..** You must st
16790 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
167a0 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  n before startin
167b0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
167c0 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72  on..** The subtr
167d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
167e0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
167f0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
16800 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d  nsaction.** comm
16810 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
16820 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e  k..**.** Only on
16830 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
16840 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 61   may be active a
16850 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73  t a time.  It is
16860 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79   an error to try
16870 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e  .** to start a n
16880 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ew subtransactio
16890 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62  n if another sub
168a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
168b0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
168c0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
168d0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
168e0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
168f0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
16900 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
16910 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
16920 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
16930 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
16940 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
16950 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
16960 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
16970 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
16980 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
16990 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
169a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
169b0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
169c0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
169d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
169e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
169f0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
16a00 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
16a10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16a20 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
16a30 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
16a40 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
16a50 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
16a60 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
16a70 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
16a80 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
16a90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
16aa0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
16ab0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
16ac0 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20 3d 20  WRITE );.  rc = 
16ad0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
16ae0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
16af0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
16b00 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  n(pBt->pPager);.
16b10 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
16b20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
16b30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
16b40 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75   the statment su
16b50 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72  btransaction cur
16b60 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
16b70 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ss.  If no.** su
16b80 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
16b90 61 63 74 69 76 65 2c 20 74 68 69 73 20 69 73 20  active, this is 
16ba0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
16bb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
16bc0 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  itStmt(Btree *p)
16bd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
16be0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16bf0 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
16c00 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d  >inStmt && !pBt-
16c10 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
16c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16c30 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74  erStmtCommit(pBt
16c40 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  ->pPager);.  }el
16c50 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
16c60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42  ITE_OK;.  }.  pB
16c70 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
16c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16c90 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
16ca0 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  e active stateme
16cb0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
16cc0 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61  n.  If no subtra
16cd0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  nsaction.** is a
16ce0 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69  ctive this routi
16cf0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
16d00 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  *.** All cursors
16d10 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
16d20 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ated by this ope
16d30 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
16d40 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61  empt.** to use a
16d50 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73   cursor that was
16d60 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
16d70 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
16d80 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  peration.** will
16d90 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
16da0 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
16db0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
16dc0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
16dd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16de0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
16df0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16e00 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44    sqlite3MallocD
16e10 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28  isallow();.  if(
16e20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
16e30 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
16e40 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16e50 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
16e60 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
16e70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  ;.    assert( co
16e80 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
16e90 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
16ea0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
16eb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c    }.  sqlite3Mal
16ec0 6c 6f 63 41 6c 6c 6f 77 28 29 3b 0a 20 20 72 65  locAllow();.  re
16ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16ee0 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f  * Default key co
16ef0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
16f00 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69 66 20  n to be used if 
16f10 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  no comparison fu
16f20 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65  nction.** is spe
16f30 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71  cified on the sq
16f40 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16f50 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  () call..*/.stat
16f60 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61  ic int dfltCompa
16f70 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  re(.  void *NotU
16f80 73 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  sed,            
16f90 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 69 73   /* User data is
16fa0 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69   not used */.  i
16fb0 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nt n1, const voi
16fc0 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72  d *p1,    /* Fir
16fd0 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72  st key to compar
16fe0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63  e */.  int n2, c
16ff0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20  onst void *p2   
17000 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20    /* Second key 
17010 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b  to compare */.){
17020 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20  .  int c;.  c = 
17030 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e  memcmp(p1, p2, n
17040 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b  1<n2 ? n1 : n2);
17050 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
17060 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a     c = n1 - n2;.
17070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a    }.  return c;.
17080 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
17090 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
170a0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
170b0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
170c0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
170d0 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75   The act of acqu
170e0 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67  iring a cursor g
170f0 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ets a read lock 
17100 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
17110 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
17120 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
17130 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
17140 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
17150 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
17160 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
17170 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
17180 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
17190 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
171a0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
171b0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
171c0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
171d0 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
171e0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
171f0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
17200 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
17210 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
17220 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
17230 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
17240 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
17250 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
17260 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
17270 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
17280 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
17290 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
172a0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
172b0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
172c0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
172d0 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
172e0 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
172f0 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
17300 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
17310 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
17320 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
17330 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
17340 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
17350 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
17360 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
17370 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
17380 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
17390 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
173a0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
173b0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
173c0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
173d0 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
173e0 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
173f0 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
17400 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
17410 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
17420 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
17430 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
17440 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
17450 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
17460 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
17470 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
17480 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
17490 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
174a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
174b0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
174c0 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** The compariso
174d0 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  n function must 
174e0 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65  be logically the
174f0 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20   same for every 
17500 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70  cursor.** on a p
17510 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
17520 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63    Changing the c
17530 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
17540 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
17550 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f  * in incorrect o
17560 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74  perations.  If t
17570 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
17580 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
17590 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d  a.** default com
175a0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
175b0 20 69 73 20 75 73 65 64 2e 20 20 54 68 65 20 63   is used.  The c
175c0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
175d0 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  on is.** always 
175e0 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b  ignored for INTK
175f0 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e  EY tables..*/.in
17600 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
17610 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
17620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
17650 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
17660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17690 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
176a0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
176e0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
176f0 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69   int (*xCmp)(voi
17700 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
17710 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
17720 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70  d*), /* Key Comp
17730 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20  arison func */. 
17740 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20   void *pArg,    
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17770 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
17780 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
17790 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20  ursor **ppCur   
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
177c0 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
177d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
177e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
177f0 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ur;.  BtShared *
17800 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
17810 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69   *ppCur = 0;.  i
17820 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
17830 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
17840 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ly ){.      retu
17850 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
17860 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
17870 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
17880 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29  (p, iTable, 0) )
17890 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
178a0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
178b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
178c0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
178d0 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74  .    rc = lockBt
178e0 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b  reeWithRetry(p);
178f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17920 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
17930 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67  adOnly && wrFlag
17940 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17950 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
17970 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ur = sqliteMallo
17980 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29  c( sizeof(*pCur)
17990 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d   );.  if( pCur==
179a0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
179b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
179c0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
179d0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
179e0 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  }.  pCur->pgnoRo
179f0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
17a00 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d  e;.  if( iTable=
17a10 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50 61 67  =1 && sqlite3Pag
17a20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
17a30 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  >pPager)==0 ){. 
17a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
17a50 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63  MPTY;.    goto c
17a60 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
17a70 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63  eption;.  }.  rc
17a80 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
17a90 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
17aa0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
17ab0 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
17ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17ad0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
17ae0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
17af0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
17b00 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
17b10 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
17b20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
17b30 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
17b40 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c   ** variables, l
17b50 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
17b60 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
17b70 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70   list and set *p
17b80 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f  pCur (the.  ** o
17b90 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74  utput argument t
17ba0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29  o this function)
17bb0 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 78  ..  */.  pCur->x
17bc0 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20 3f  Compare = xCmp ?
17bd0 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70   xCmp : dfltComp
17be0 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72  are;.  pCur->pAr
17bf0 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43 75 72  g = pArg;.  pCur
17c00 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
17c10 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77  pCur->wrFlag = w
17c20 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70  rFlag;.  pCur->p
17c30 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
17c40 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  sor;.  if( pCur-
17c50 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
17c60 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
17c70 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70   = pCur;.  }.  p
17c80 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
17c90 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
17ca0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
17cb0 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20  LID;.  *ppCur = 
17cc0 70 43 75 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20  pCur;..  return 
17cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72 65 61 74  SQLITE_OK;.creat
17ce0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
17cf0 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  on:.  if( pCur )
17d00 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
17d10 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
17d20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
17d30 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f  Cur);.  }.  unlo
17d40 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
17d50 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pBt);.  return r
17d60 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20  c;.}..#if 0  /* 
17d70 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 2f 2a 0a 2a  Not Used */./*.*
17d80 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
17d90 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  ue of the compar
17da0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73  ison function us
17db0 65 64 20 62 79 20 61 20 63 75 72 73 6f 72 2e 0a  ed by a cursor..
17dc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
17dd0 74 72 65 65 53 65 74 43 6f 6d 70 61 72 65 28 0a  treeSetCompare(.
17de0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
17df0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ,     /* The cur
17e00 73 6f 72 20 74 6f 20 77 68 6f 73 65 20 63 6f 6d  sor to whose com
17e10 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
17e20 20 69 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20   is changed */. 
17e30 20 69 6e 74 28 2a 78 43 6d 70 29 28 76 6f 69 64   int(*xCmp)(void
17e40 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
17e50 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
17e60 2a 29 2c 20 2f 2a 20 4e 65 77 20 63 6f 6d 70 61  *), /* New compa
17e70 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20  rison func */.  
17e80 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
17e90 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
17ea0 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70 28 29 20  ument to xCmp() 
17eb0 2a 2f 0a 29 7b 0a 20 20 70 43 75 72 2d 3e 78 43  */.){.  pCur->xC
17ec0 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70 20 3f 20  ompare = xCmp ? 
17ed0 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61  xCmp : dfltCompa
17ee0 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72 67  re;.  pCur->pArg
17ef0 20 3d 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69   = pArg;.}.#endi
17f00 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  f../*.** Close a
17f10 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
17f20 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
17f30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
17f40 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
17f50 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
17f60 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
17f70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
17f80 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
17f90 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
17fa0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
17fb0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
17fc0 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f  .  clearCursorPo
17fd0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
17fe0 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
17ff0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72  ){.    pCur->pPr
18000 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
18010 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
18020 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  {.    pBt->pCurs
18030 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
18040 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
18050 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
18060 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
18070 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
18080 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
18090 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
180a0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
180b0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 23 69 66  Unused(pBt);.#if
180c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
180d0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 73 71 6c 69  _INCRBLOB.  sqli
180e0 74 65 46 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  teFree(pCur->aOv
180f0 65 72 66 6c 6f 77 29 3b 0a 23 65 6e 64 69 66 0a  erflow);.#endif.
18100 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
18110 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
18120 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18130 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
18140 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
18150 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
18160 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
18170 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
18180 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
18190 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
181a0 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
181b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
181c0 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  etTempCursor(BtC
181d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43  ursor *pCur, BtC
181e0 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29  ursor *pTempCur)
181f0 7b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  {.  memcpy(pTemp
18200 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
18210 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65  f(*pCur));.  pTe
18220 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30  mpCur->pNext = 0
18230 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  ;.  pTempCur->pP
18240 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rev = 0;.  if( p
18250 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29  TempCur->pPage )
18260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
18270 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
18280 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
18290 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
182a0 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  lete a temporary
182b0 20 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20   cursor such as 
182c0 77 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  was made by the 
182d0 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43  CreateTemporaryC
182e0 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74  ursor().** funct
182f0 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  ion above..*/.st
18300 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
18310 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
18320 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
18330 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
18340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
18350 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
18360 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
18370 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
18380 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
18390 6f 72 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66  or.info field of
183a0 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
183b0 72 20 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49  r is valid..** I
183c0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
183d0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20  ady valid, call 
183e0 70 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  parseCell() to f
183f0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
18400 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
18410 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
18420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
18430 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
18440 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
18450 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
18460 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
18470 73 20 74 6f 20 70 61 72 73 65 43 65 6c 6c 28 29  s to parseCell()
18480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18490 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
184a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
184b0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
184c0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Size==0 ){.    p
184d0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
184e0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
184f0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
18500 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
18510 4e 44 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49  NDEBUG.    CellI
18520 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
18530 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
18540 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
18550 20 20 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72    parseCell(pCur
18560 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
18570 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  dx, &info);.    
18580 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26  assert( memcmp(&
18590 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
185a0 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
185b0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
185c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  }.}../*.** Set *
185d0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
185e0 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
185f0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
18600 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
18610 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
18620 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
18630 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
18640 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
18650 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
18660 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
18670 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
18680 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
18690 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
186a0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
186b0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
186c0 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
186d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
186e0 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
186f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18700 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
18710 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
18720 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
18730 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18740 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18750 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18770 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18780 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
18790 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
187a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
187b0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
187c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
187d0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
187e0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
187f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18800 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
18810 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
18820 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
18830 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
18840 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18850 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
18860 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
18870 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
18880 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
18890 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
188a0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
188b0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
188c0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
188d0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
188e0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
188f0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
18900 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
18910 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
18920 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
18930 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
18940 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18950 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
18960 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
18970 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
18980 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
18990 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
189a0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
189b0 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72  t rc = restoreOr
189c0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
189d0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
189e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
189f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18a00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18a10 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
18a20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18a30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
18a40 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
18a50 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
18a60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
18a70 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
18a80 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74  alid entry - set
18a90 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f   *pSize to 0. */
18aa0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
18ab0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
18ac0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
18ad0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
18ae0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
18af0 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  .nData;.    }.  
18b00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18b10 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
18b20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
18b30 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
18b40 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
18b50 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
18b60 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
18b70 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
18b80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
18b90 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
18ba0 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
18bb0 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
18bc0 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
18bd0 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
18be0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
18bf0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
18c00 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
18c10 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
18c20 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
18c30 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
18c40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
18c50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
18c60 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
18c70 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
18c80 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65  * Unless pPgnoNe
18c90 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  xt is NULL, the 
18ca0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
18cb0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
18cc0 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65   .** page in the
18cd0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
18ce0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
18cf0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
18d00 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  vfl.** is the la
18d10 73 74 20 70 61 67 65 20 69 6e 20 69 74 27 73 20  st page in it's 
18d20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50  linked list, *pP
18d30 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
18d40 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
18d50 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
18d60 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73  NULL, *ppPage is
18d70 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50   set to the MemP
18d80 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66  age* handle.** f
18d90 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68  or page ovfl. Th
18da0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67  e underlying pag
18db0 65 72 20 70 61 67 65 20 6d 61 79 20 68 61 76 65  er page may have
18dc0 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a   been requested.
18dd0 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f  ** with the noCo
18de0 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20  ntent flag set, 
18df0 73 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  so the page data
18e00 20 61 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a   accessable via.
18e10 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d  ** this handle m
18e20 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65  ay not be truste
18e30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18e40 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
18e50 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
18e60 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c  t, .  Pgno ovfl,
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
18e90 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  age */.  MemPage
18ea0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
18eb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
18ec0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  mPage handle */.
18ed0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
18ee0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
18ef0 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
18f00 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
18f10 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
18f20 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  xt = 0;.  int rc
18f30 3b 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  ;..  /* One of t
18f40 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  hese must not be
18f50 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65   NULL. Otherwise
18f60 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20  , why call this 
18f70 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61  function? */.  a
18f80 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20  ssert(ppPage || 
18f90 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f  pPgnoNext);..  /
18fa0 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69  * If pPgnoNext i
18fb0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
18fc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  s function is be
18fd0 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62  ing called to ob
18fe0 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50  tain.  ** a MemP
18ff0 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f  age* reference o
19000 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74  nly. No page-dat
19010 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  a is required in
19020 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f   this case..  */
19030 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78  .  if( !pPgnoNex
19040 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
19050 67 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  getPage(pBt, ovf
19060 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  l, ppPage, 1);. 
19070 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
19080 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
19090 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
190a0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
190b0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
190c0 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
190d0 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
190e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
190f0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
19100 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
19110 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
19120 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
19130 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
19140 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
19150 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
19160 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
19170 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
19180 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
19190 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
191a0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
191b0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
191c0 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
191d0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
191e0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
191f0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
19200 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
19210 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
19220 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
19230 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
19240 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
19250 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19260 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
19270 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
19280 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 73 71     if( iGuess<sq
19290 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
192a0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
192b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
192c0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
192d0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
192e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
192f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19310 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19320 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
19330 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
19340 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
19350 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
19360 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uess;.      }.  
19370 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
19380 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c    if( next==0 ||
19390 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d   ppPage ){.    M
193a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
193b0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74  0;..    rc = get
193c0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
193d0 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29  &pPage, next!=0)
193e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d  ;.    assert(rc=
193f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
19400 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28  age==0);.    if(
19410 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d   next==0 && rc==
19420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19430 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
19440 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
19450 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
19460 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20   ppPage ){.     
19470 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
19480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19490 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
194a0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
194b0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
194c0 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  next;..  return 
194d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
194e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
194f0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
19500 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
19510 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
19520 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
19530 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
19540 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
19550 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
19560 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
19570 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
19580 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
19590 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
195a0 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
195b0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
195c0 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
195d0 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
195e0 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
195f0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
19600 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
19610 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
19620 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
19630 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
19640 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
19650 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
19660 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19670 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
19680 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65  a distinction be
19690 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  tween key and da
196a0 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72  ta..** It just r
196b0 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62  eads or writes b
196c0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ytes from the pa
196d0 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74  yload area.  Dat
196e0 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65  a might .** appe
196f0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
19700 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65  age or be scatte
19710 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
19720 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ple overflow .**
19730 20 70 61 67 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   pages..*/.#defi
19740 6e 65 20 67 65 74 50 61 79 6c 6f 61 64 28 61 2c  ne getPayload(a,
19750 62 2c 63 2c 64 2c 65 29 20 61 63 63 65 73 73 50  b,c,d,e) accessP
19760 61 79 6c 6f 61 64 28 61 2c 62 2c 63 2c 64 2c 65  ayload(a,b,c,d,e
19770 2c 30 29 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ,0).static int a
19780 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
19790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
197a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
197b0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
197c0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
197d0 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20  .  int offset,  
197e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
197f0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
19800 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
19810 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
19820 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
19830 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
19840 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19850 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
19860 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
19870 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
19880 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
19890 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
198a0 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
198b0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
198c0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
198e0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
198f0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
19900 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
19910 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
19920 3b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67  ;.  Pgno nextPag
19930 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  e;.  int rc;.  M
19940 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
19950 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
19960 20 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 3b 0a    int ovflSize;.
19970 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
19980 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20 61  t iIdx = 0;..  a
19990 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
199a0 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  & pCur->pPage!=0
199b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
199c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
199d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 42  OR_VALID );.  pB
199e0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
199f0 2d 3e 70 42 74 3b 0a 20 20 70 50 61 67 65 20 3d  ->pBt;.  pPage =
19a00 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
19a10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
19a20 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
19a30 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
19a40 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
19a50 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
19a60 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
19a70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
19a80 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
19a90 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
19aa0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
19ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
19ac0 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
19ad0 4b 65 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Key;.  }.  asser
19ae0 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
19af0 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
19b00 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
19b10 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
19b20 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
19b30 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
19b40 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
19b50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
19b60 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  }.  if( offset<p
19b70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19b80 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
19b90 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
19ba0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
19bb0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
19bc0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
19bd0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
19be0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
19bf0 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  Op ){.      /* A
19c00 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
19c10 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
19c20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19c30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
19c40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
19c80 65 6d 63 70 79 28 26 61 50 61 79 6c 6f 61 64 5b  emcpy(&aPayload[
19c90 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
19ca0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19cb0 20 20 20 20 2f 2a 20 41 20 72 65 61 64 20 6f 70      /* A read op
19cc0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  eration */.     
19cd0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61   memcpy(pBuf, &a
19ce0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
19cf0 20 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   a);.    }.    i
19d00 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20  f( a==amt ){.   
19d10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19d20 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  _OK;.    }.    o
19d30 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
19d40 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
19d50 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
19d60 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
19d70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19d80 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65  ;.  }.  ovflSize
19d90 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
19da0 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d  ze - 4;.  if( am
19db0 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65 78 74 50  t>0 ){.    nextP
19dc0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
19dd0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
19de0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 23 69  nfo.nLocal]);.#i
19df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19e00 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69  T_INCRBLOB.    i
19e10 66 28 20 70 43 75 72 2d 3e 63 61 63 68 65 4f 76  f( pCur->cacheOv
19e20 65 72 66 6c 6f 77 20 26 26 20 21 70 43 75 72 2d  erflow && !pCur-
19e30 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
19e40 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
19e50 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
19e60 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
19e70 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
19e80 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
19e90 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
19ea0 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
19eb0 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
19ec0 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
19ed0 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26       if( nOvfl &
19ee0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
19ef0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ow ){.        re
19f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19f10 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
19f20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
19f30 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
19f40 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
19f50 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
19f60 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
19f70 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
19f80 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
19f90 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
19fa0 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
19fb0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
19fc0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
19fd0 23 65 6e 64 69 66 0a 20 20 20 20 66 6f 72 28 69  #endif.    for(i
19fe0 49 64 78 2b 2b 3b 20 61 6d 74 3e 30 20 26 26 20  Idx++; amt>0 && 
19ff0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
1a000 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ){.      if( off
1a010 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
1a020 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1a030 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
1a040 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
1a050 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
1a060 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
1a070 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
1a080 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1a090 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 53  verflow chain. S
1a0a0 6f 20 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  o try.        **
1a0b0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
1a0c0 50 61 67 65 28 29 20 73 68 6f 72 74 63 75 74 2e  Page() shortcut.
1a0d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1a0e0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
1a0f0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
1a100 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
1a110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1a120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1a140 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1a150 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
1a160 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 23  t -= ovflSize;.#
1a170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a180 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1a190 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1a1a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1a1b0 20 20 20 20 20 61 73 73 65 72 74 28 6e 65 78 74       assert(next
1a1c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1a1d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1a1e0 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
1a1f0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  e;.        }.#en
1a200 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1a210 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
1a220 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
1a230 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
1a240 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
1a250 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a260 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
1a270 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
1a280 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
1a290 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
1a2a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a2b0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1a2c0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
1a2d0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
1a2e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a2f0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
1a300 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
1a310 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1a320 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1a330 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a350 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
1a360 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1a370 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
1a380 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1a390 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
1a3a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1a3b0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1a3c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1a3d0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
1a3e0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
1a3f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 65   }.        if( e
1a400 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Op ){.          
1a410 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61  /* A write opera
1a420 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
1a430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a440 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
1a450 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1a460 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a480 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1a490 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
1a4a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1a4b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1a4c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
1a4d0 65 6d 63 70 79 28 26 61 50 61 79 6c 6f 61 64 5b  emcpy(&aPayload[
1a4e0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
1a4f0 20 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   a);.        }el
1a500 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1a510 20 41 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   A read operatio
1a520 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  n */.          m
1a530 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50 61  emcpy(pBuf, &aPa
1a540 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
1a550 20 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   a);.        }. 
1a560 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
1a570 30 3b 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d  0;.        amt -
1a580 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
1a590 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
1a5a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1a5b0 66 28 70 44 62 50 61 67 65 29 3b 0a 23 69 66 6e  f(pDbPage);.#ifn
1a5c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a5d0 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
1a5e0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1a5f0 66 6c 6f 77 20 26 26 20 6e 65 78 74 50 61 67 65  flow && nextPage
1a600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
1a610 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1a620 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
1a630 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
1a640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a650 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20   }..  if( amt>0 
1a660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1a670 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a680 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1a690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a6a0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1a6b0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
1a6c0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1a6d0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1a6e0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1a6f0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1a700 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1a710 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1a720 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1a730 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
1a740 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1a750 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1a760 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1a770 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1a780 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1a790 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1a7a0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1a7b0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1a7c0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1a7d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a7e0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1a7f0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1a800 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1a810 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
1a820 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
1a830 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
1a840 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1a850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a860 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a870 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a880 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1a890 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a8a0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
1a8b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
1a8c0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
1a8d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1a8e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1a8f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a900 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
1a910 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a920 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1a930 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
1a940 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1a950 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 79 6c      rc = getPayl
1a960 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1a970 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
1a980 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
1a990 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a9a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1a9b0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
1a9c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1a9d0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1a9e0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1a9f0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1aa00 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1aa10 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1aa20 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1aa30 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1aa40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1aa50 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1aa60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1aa70 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1aa80 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
1aa90 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
1aaa0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
1aab0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
1aac0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
1aad0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
1aae0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
1aaf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ab00 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
1ab10 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
1ab20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
1ab30 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
1ab40 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1ab50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ab60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1ab70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1ab80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1ab90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1aba0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
1abb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1abc0 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1abd0 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
1abe0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1abf0 72 63 20 3d 20 67 65 74 50 61 79 6c 6f 61 64 28  rc = getPayload(
1ac00 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1ac10 74 2c 20 70 42 75 66 2c 20 31 29 3b 0a 20 20 7d  t, pBuf, 1);.  }
1ac20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ac30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1ac40 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1ac50 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1ac60 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1ac70 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1ac80 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1ac90 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1aca0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1acb0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1acc0 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1acd0 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1ace0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1acf0 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1ad00 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1ad10 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ad20 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1ad30 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1ad40 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1ad50 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1ad60 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1ad70 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1ad80 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1ad90 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1ada0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1adb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1adc0 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1add0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1ade0 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1adf0 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1ae00 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1ae10 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1ae20 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1ae30 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1ae40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1ae50 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1ae60 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1ae70 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1ae80 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1ae90 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1aea0 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1aeb0 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1aec0 61 67 65 73 2c 20 74 68 65 6e 20 67 65 74 50 61  ages, then getPa
1aed0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
1aee0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
1aef0 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  ly.** the key/da
1af00 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
1af10 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
1af20 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
1af30 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1af40 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
1af50 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
1af60 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
1af70 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
1af80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1af90 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
1afa0 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
1afb0 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
1afc0 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
1afd0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1afe0 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1aff0 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
1b000 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1b010 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1b020 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1b030 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1b040 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1b050 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
1b060 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1b070 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1b080 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
1b090 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
1b0a0 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
1b0b0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
1b0c0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1b0d0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
1b0e0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1b0f0 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
1b100 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
1b110 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  int nLocal;..
1b120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
1b130 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
1b140 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b150 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b160 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1b170 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1b180 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1b190 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1b1a0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1b1b0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1b1c0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1b1d0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1b1e0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1b1f0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1b200 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1b210 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1b220 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1b230 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1b240 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
1b250 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1b260 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1b270 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1b280 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1b290 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1b2a0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1b2b0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1b2c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1b2d0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1b2e0 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1b2f0 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1b300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1b310 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1b320 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1b330 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1b340 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1b350 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1b360 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1b370 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1b380 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1b390 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1b3a0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1b3b0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1b3c0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1b3d0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1b3e0 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1b3f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1b400 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1b410 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1b420 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1b430 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1b440 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1b450 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1b460 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
1b470 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
1b480 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
1b490 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
1b4a0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
1b4b0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1b4c0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
1b4d0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
1b4e0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
1b4f0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
1b500 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
1b510 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
1b520 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
1b530 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1b540 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1b550 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1b560 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1b570 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1b580 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1b590 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1b5a0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1b5b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b5c0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66  int *pAmt){.  if
1b5d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b5e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1b5f0 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1b600 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1b610 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1b620 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1b630 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1b640 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1b650 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1b660 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1b670 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1b680 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1b690 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1b6a0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1b6b0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1b6c0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1b6d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1b6e0 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1b6f0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1b700 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50  pNewPage;.  MemP
1b710 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20  age *pOldPage;. 
1b720 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b730 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
1b740 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
1b750 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b760 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
1b770 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1b780 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1b790 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72   &pNewPage, pCur
1b7a0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  ->pPage);.  if( 
1b7b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b7c0 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50    pNewPage->idxP
1b7d0 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64  arent = pCur->id
1b7e0 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20  x;.  pOldPage = 
1b7f0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
1b800 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66  OldPage->idxShif
1b810 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  t = 0;.  release
1b820 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a  Page(pOldPage);.
1b830 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1b840 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1b850 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75  ->idx = 0;.  pCu
1b860 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1b870 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
1b880 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20  e->nCell<1 ){.  
1b890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b8a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b8b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1b8c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1b8d0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b8e0 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76 69  e page is the vi
1b8f0 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74  rtual root of it
1b900 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  s table..**.** T
1b910 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
1b920 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  page is the root
1b930 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74   page for most t
1b940 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66  ables.  But.** f
1b950 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  or the table roo
1b960 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73  ted on page 1, s
1b970 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c  ometime the real
1b980 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
1b990 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
1b9a0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
1b9b0 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61  ter.  In such ca
1b9c0 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ses the.** virtu
1b9d0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
1b9e0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
1b9f0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
1ba00 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20  of page.** 1 is 
1ba10 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
1ba20 73 74 61 74 69 63 20 69 6e 74 20 69 73 52 6f 6f  static int isRoo
1ba30 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
1ba40 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
1ba50 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67   *pParent = pPag
1ba60 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
1ba70 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
1ba80 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1ba90 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
1baa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1bab0 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
1bac0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
1bad0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
1bae0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1baf0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1bb00 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1bb10 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
1bb20 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
1bb30 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
1bb40 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
1bb50 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
1bb60 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
1bb70 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1bb80 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1bb90 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1bba0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1bbb0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1bbc0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1bbd0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1bbe0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1bbf0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1bc00 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1bc10 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
1bc20 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1bc30 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1bc40 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
1bc50 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
1bc60 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
1bc70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1bc80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1bc90 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
1bca0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
1bcb0 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
1bcc0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 52  ;.  assert( !isR
1bcd0 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1bce0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
1bcf0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
1bd00 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1bd10 3d 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e  =0 );.  idxParen
1bd20 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  t = pPage->idxPa
1bd30 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  rent;.  sqlite3P
1bd40 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
1bd50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c  >pDbPage);.  rel
1bd60 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1bd70 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
1bd80 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72   pParent;.  pCur
1bd90 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1bda0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1bdb0 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30  ent->idxShift==0
1bdc0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20   );.  pCur->idx 
1bdd0 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a  = idxParent;.}..
1bde0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1bdf0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1be00 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1be10 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1be20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1be30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1be40 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1be50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
1be60 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1be70 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20  >pBtree->pBt;.. 
1be80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1be90 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
1bea0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 63 6c 65  ESEEK ){.    cle
1beb0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
1bec0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52  (pCur);.  }.  pR
1bed0 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
1bee0 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26  e;.  if( pRoot &
1bef0 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  & pRoot->pgno==p
1bf00 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  Cur->pgnoRoot ){
1bf10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1bf20 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ot->isInit );.  
1bf30 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a  }else{.    if( .
1bf40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21        SQLITE_OK!
1bf50 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69  =(rc = getAndIni
1bf60 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
1bf70 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f  >pgnoRoot, &pRoo
1bf80 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  t, 0)).    ){.  
1bf90 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1bfa0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1bfb0 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
1bfc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  rc;.    }.    re
1bfd0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1bfe0 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
1bff0 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b  ->pPage = pRoot;
1c000 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78  .  }.  pCur->idx
1c010 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1c020 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1c030 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
1c040 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
1c050 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1c060 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73  subpage;.    ass
1c070 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1c080 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61  ==1 );.    subpa
1c090 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
1c0a0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
1c0b0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1c0c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75  ;.    assert( su
1c0d0 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70  bpage>0 );.    p
1c0e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1c0f0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
1c100 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1c110 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
1c120 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
1c130 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50  ate = ((pCur->pP
1c140 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  age->nCell>0)?CU
1c150 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
1c160 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65  R_INVALID);.  re
1c170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c180 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1c190 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
1c1a0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
1c1b0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1c1c0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
1c1d0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1c1e0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
1c1f0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
1c200 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
1c210 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
1c220 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
1c230 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
1c240 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1c250 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
1c260 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1c270 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1c280 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  o;.  int rc;.  M
1c290 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1c2a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c2b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1c2c0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1c2d0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1c2e0 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
1c2f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1c300 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
1c310 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
1c320 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
1c330 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1c340 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1c350 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d  >idx));.    rc =
1c360 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1c370 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
1c380 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1c390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c3a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c3b0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1c3c0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
1c3d0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
1c3e0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1c3f0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
1c400 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1c410 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
1c420 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
1c430 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
1c440 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
1c450 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
1c460 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
1c470 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1c480 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
1c490 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1c4a0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
1c4b0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1c4c0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
1c4d0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1c4e0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
1c4f0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
1c500 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1c510 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1c520 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
1c530 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
1c540 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
1c550 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1c560 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
1c570 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
1c580 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
1c590 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  ;.  int rc;.  Me
1c5a0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1c5b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1c5c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c5d0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1c5e0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1c5f0 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
1c600 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1c610 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1c620 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1c630 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
1c640 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1c650 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1c660 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1c670 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1c680 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1c690 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20    }.  pCur->idx 
1c6a0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  = pPage->nCell -
1c6b0 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   1;.  pCur->info
1c6c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65  .nSize = 0;.  re
1c6d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c6e0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1c6f0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1c700 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1c710 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1c720 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1c730 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1c740 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1c750 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1c760 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1c770 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1c780 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1c790 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1c7a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c7b0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1c7c0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1c7d0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1c7e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1c7f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1c800 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
1c810 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1c820 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c830 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c840 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1c850 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
1c860 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1c870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c880 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1c890 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
1c8a0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
1c8b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1c8c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1c8d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1c8e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1c8f0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1c900 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1c910 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1c920 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1c930 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1c940 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1c950 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1c960 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1c970 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1c980 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1c990 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1c9a0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1c9b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1c9c0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1c9d0 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  t rc;.  rc = mov
1c9e0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1c9f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1ca00 20 72 63 3b 0a 20 20 69 66 28 20 43 55 52 53 4f   rc;.  if( CURSO
1ca10 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1ca20 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 61  >eState ){.    a
1ca30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1ca40 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1ca50 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1ca60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ca70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
1ca80 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1ca90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1caa0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1cab0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1cac0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
1cad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1cae0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1caf0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1cb00 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1cb10 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20  r pKey/nKey..** 
1cb20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
1cb30 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
1cb40 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
1cb50 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61  only the nKey pa
1cb60 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
1cb70 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
1cb80 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72  ored.  For other
1cb90 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73   tables, nKey is
1cba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1cbb0 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20  ytes of data.** 
1cbc0 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63 6f  in pKey.  The co
1cbd0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1cbe0 6e 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  n specified when
1cbf0 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
1cc00 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20 75 73  ** created is us
1cc10 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65  ed to compare ke
1cc20 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ys..**.** If an 
1cc30 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1cc40 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1cc50 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1cc60 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1cc70 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1cc80 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1cc90 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1cca0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1ccb0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1ccc0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1ccd0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1cce0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1ccf0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1cd00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1cd10 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
1cd20 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1cd30 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1cd40 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
1cd50 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
1cd60 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20   if pRes!=NULL. 
1cd70 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a   The meaning of.
1cd80 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  ** this value is
1cd90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1cda0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
1cdb0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1cdc0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1cdd0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1cde0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1cdf0 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
1ce00 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20  than pKey or if 
1ce10 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1ce20 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
1ce30 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
1ce40 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
1ce50 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
1ce60 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
1ce70 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
1ce80 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1ce90 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1cea0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
1ced0 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  s pKey..**.**   
1cee0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1cef0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1cf00 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1cf10 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
1cf40 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Key..*/.int sqli
1cf50 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
1cf60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1cf70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1cf80 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1cf90 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
1cfa0 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
1cfb0 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e  * The key conten
1cfc0 74 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20  t for indices.  
1cfd0 4e 6f 74 20 75 73 65 64 20 62 79 20 74 61 62 6c  Not used by tabl
1cfe0 65 73 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  es */.  i64 nKey
1cff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1d000 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20  * Size of pKey. 
1d010 20 4f 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20   Or the key for 
1d020 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
1d030 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
1d040 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1d050 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1d060 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1d070 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1d080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1d090 61 72 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67  arch result flag
1d0a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1d0b0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1d0c0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1d0d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1d0e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d0f0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1d100 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1d110 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1d120 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1d130 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1d140 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1d150 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1d160 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1d170 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1d180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1d190 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1d1a0 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1d1b0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1d1c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1d1d0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1d1e0 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20     int c = -1;  
1d1f0 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69  /* pRes return i
1d200 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  f table is empty
1d210 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20   must be -1 */. 
1d220 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
1d230 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
1d240 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70  ll-1;.    if( !p
1d250 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1d260 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
1d270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d280 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1d290 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1d2a0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1d2b0 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1d2c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d2d0 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72  pCur->idx = (upr
1d2e0 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +lwr)/2;.    }. 
1d2f0 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20     if( lwr<=upr 
1d300 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20  ) for(;;){.     
1d310 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1d320 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1d330 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1d340 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1d350 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1d360 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1d370 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1d380 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1d390 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1d3a0 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67  Cur->idx) + pPag
1d3b0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1d3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1d3d0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1d3e0 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1d3f0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1d400 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1d410 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79  32(pCell, &dummy
1d420 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d430 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
1d440 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43  Cell, (u64 *)&nC
1d450 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1d460 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b   if( nCellKey<nK
1d470 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1d480 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1d490 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1d4a0 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey>nKey ){.     
1d4b0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
1d4c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d4d0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
1d4e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1d4f0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1d500 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20  available;.     
1d510 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76     pCellKey = (v
1d520 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f  oid *)fetchPaylo
1d530 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61  ad(pCur, &availa
1d540 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
1d550 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72   nCellKey = pCur
1d560 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
1d570 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62       if( availab
1d580 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a  le>=nCellKey ){.
1d590 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
1d5a0 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75  ur->xCompare(pCu
1d5b0 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65  r->pArg, nCellKe
1d5c0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65  y, pCellKey, nKe
1d5d0 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
1d5e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d5f0 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
1d600 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
1d610 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20  CellKey );.     
1d620 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
1d630 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
1d640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d650 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d660 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
1d670 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76   0, nCellKey, (v
1d680 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b  oid *)pCellKey);
1d690 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
1d6a0 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43  Cur->xCompare(pC
1d6b0 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b  ur->pArg, nCellK
1d6c0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b  ey, pCellKey, nK
1d6d0 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
1d6e0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1d6f0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1d700 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1d710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d720 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d730 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1d740 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1d750 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61  leafData && !pPa
1d760 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d770 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1d780 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  ->idx;.         
1d790 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
1d7a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d7b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d7c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
1d7d0 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a  es ) *pRes = 0;.
1d7e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d7f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d800 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d810 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1d820 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75         lwr = pCu
1d830 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20  r->idx+1;.      
1d840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
1d850 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31  pr = pCur->idx-1
1d860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d870 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
1d880 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d890 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
1d8a0 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  ->idx = (lwr+upr
1d8b0 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  )/2;.    }.    a
1d8c0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
1d8d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1d8e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1d8f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1d900 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
1d910 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
1d920 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
1d930 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1d940 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1d950 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d960 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d970 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
1d980 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
1d990 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
1d9a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
1d9b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1d9c0 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
1d9d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1d9e0 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
1d9f0 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61  r->idx<pCur->pPa
1da00 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1da10 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1da20 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
1da30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1da40 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1da50 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20  >idx = lwr;.    
1da60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1da70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
1da80 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1da90 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
1daa0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
1dab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1dac0 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43   }.  /* NOT REAC
1dad0 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  HED */.}../*.** 
1dae0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1daf0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1db00 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1db10 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1db20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1db30 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1db40 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1db50 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1db60 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1db70 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1db80 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1db90 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1dba0 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1dbb0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1dbc0 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1dbd0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1dbe0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1dbf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1dc00 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1dc10 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1dc20 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1dc30 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1dc40 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1dc50 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1dc60 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1dc70 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1dc80 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1dc90 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1dca0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1dcb0 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1dcc0 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1dcd0 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1dce0 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1dcf0 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1dd00 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1dd10 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
1dd20 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
1dd30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1dd40 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1dd50 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1dd60 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1dd70 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1dd80 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1dd90 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
1dda0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1ddb0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
1ddc0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1ddd0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
1dde0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
1ddf0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1de00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1de10 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1de20 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
1de30 20 2a 70 50 61 67 65 3b 0a 0a 20 20 72 63 20 3d   *pPage;..  rc =
1de40 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
1de50 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1de60 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1de70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1de90 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
1dea0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1deb0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1dec0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1ded0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1dee0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1def0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1df00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1df10 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1df20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1df30 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1df40 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1df50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1df60 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
1df70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1df80 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1df90 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70  ert( pCur->idx<p
1dfa0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
1dfb0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
1dfc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1dfd0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
1dfe0 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  r->idx>=pPage->n
1dff0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1e000 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1e010 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1e020 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1e030 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1e040 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e050 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1e060 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e070 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1e080 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1e090 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1e0a0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1e0b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e0c0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1e0d0 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
1e0e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  ) ){.        *pR
1e0f0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1e100 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1e110 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1e120 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1e130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1e140 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
1e150 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1e160 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1e170 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1e180 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1e190 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1e1a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1e1b0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1e1c0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
1e1d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1e1e0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1e1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e210 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1e220 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1e230 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1e240 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1e250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e260 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1e270 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1e280 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e290 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
1e2a0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1e2b0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1e2c0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1e2d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1e2e0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1e2f0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1e300 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1e310 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1e320 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1e330 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1e340 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1e350 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1e360 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1e370 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1e380 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e390 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1e3a0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1e3b0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1e3c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1e3d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1e3e0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1e3f0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1e400 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1e410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e420 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1e430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53  ;.  }.  if( CURS
1e440 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1e450 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1e460 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1e470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e480 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1e490 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1e4a0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1e4b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1e4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e4d0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1e4e0 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1e4f0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1e500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e510 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1e520 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1e530 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
1e540 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1e550 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1e560 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
1e570 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
1e580 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1e590 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1e5a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e5b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
1e5c0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1e5d0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
1e5e0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
1e5f0 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20  ur->idx==0 ){.  
1e600 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61      if( isRootPa
1e610 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1e620 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1e630 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1e640 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
1e650 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
1e660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1e680 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1e690 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1e6a0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1e6b0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1e6c0 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x--;.    pCur->i
1e6d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1e6e0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1e6f0 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1e700 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1e710 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e720 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1e730 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1e740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e750 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e760 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1e770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e780 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
1e790 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
1e7a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e7b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
1e7c0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
1e7d0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
1e7e0 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
1e7f0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1e800 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1e810 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
1e820 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
1e830 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
1e840 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
1e850 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
1e860 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
1e870 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1e880 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
1e890 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
1e8a0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
1e8b0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
1e8c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1e8d0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1e8e0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
1e8f0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
1e900 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
1e910 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
1e920 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
1e930 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
1e940 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
1e950 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
1e960 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
1e970 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
1e980 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
1e990 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1e9a0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
1e9b0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1e9c0 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
1e9d0 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
1e9e0 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
1e9f0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
1ea00 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
1ea10 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
1ea20 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
1ea30 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
1ea40 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
1ea50 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
1ea60 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
1ea70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
1ea80 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
1ea90 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
1eaa0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
1eab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1eac0 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
1ead0 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
1eae0 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
1eaf0 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
1eb00 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1eb10 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
1eb20 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
1eb30 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
1eb40 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
1eb50 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
1eb60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
1eb70 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
1eb80 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
1eb90 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1eba0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
1ebb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
1ebc0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
1ebd0 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
1ebe0 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
1ebf0 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
1ec00 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1ec10 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
1ec20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   int n;     /* N
1ec30 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
1ec40 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
1ec50 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f  /.  int k;     /
1ec60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
1ec70 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
1ec80 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1ec90 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
1eca0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
1ecb0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
1ecc0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 31 20 3d  = 0;..  pPage1 =
1ecd0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1ece0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1ecf0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1ed00 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1ed10 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1ed20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1ed30 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1ed40 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1ed50 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1ed60 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1ed70 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1ed80 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1ed90 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1eda0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1edb0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1edc0 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1edd0 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1ede0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1edf0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1ee00 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1ee10 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1ee20 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1ee30 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1ee40 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1ee50 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1ee60 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1ee70 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1ee80 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1ee90 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1eea0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1eeb0 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  t ){.      u8 eT
1eec0 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ype;.      asser
1eed0 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
1eee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1eef0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
1ef00 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1ef10 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
1ef20 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
1ef30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ef40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
1ef50 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ef60 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1ef70 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1ef80 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1ef90 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62    *pPgno = nearb
1efa0 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
1efb0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
1efc0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
1efd0 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
1efe0 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
1eff0 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
1f000 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
1f010 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
1f020 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
1f030 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
1f040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f050 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1f060 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f070 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f080 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
1f090 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f0a0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
1f0b0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
1f0c0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
1f0d0 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
1f0e0 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
1f0f0 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
1f100 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
1f110 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
1f120 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1f130 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
1f140 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
1f150 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
1f160 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
1f170 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
1f180 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
1f190 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
1f1a0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
1f1b0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1f1c0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1f1d0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1f1e0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
1f1f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f200 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1f210 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1f220 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
1f230 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
1f240 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
1f250 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
1f260 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1f270 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1f280 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1f290 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1f2a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f2b0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
1f2c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
1f2d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
1f2e0 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
1f2f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1f300 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
1f310 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
1f320 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
1f330 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
1f340 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
1f350 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
1f360 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
1f370 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
1f380 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
1f390 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
1f3a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
1f3b0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
1f3c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f3d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1f3e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1f3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1f400 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1f410 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1f420 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f430 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
1f440 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
1f450 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1f460 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1f470 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1f480 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1f490 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1f4a0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1f4b0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1f4c0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1f4d0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1f4e0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1f4f0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
1f500 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e  else if( k>pBt->
1f510 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1f520 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
1f530 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
1f540 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
1f550 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1f560 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1f570 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f580 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
1f590 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f5a0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
1f5b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f5c0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
1f5d0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
1f5e0 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
1f5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1f600 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
1f610 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
1f620 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
1f630 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1f640 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
1f650 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
1f660 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
1f670 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
1f680 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1f690 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
1f6a0 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
1f6b0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1f6c0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1f6d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
1f6e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f6f0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1f700 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1f710 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1f720 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1f730 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1f740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1f750 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
1f760 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
1f770 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1f780 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1f790 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1f7a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1f7b0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
1f7c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f7d0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
1f7e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
1f7f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1f800 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1f810 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1f820 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1f830 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
1f840 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1f850 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
1f860 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
1f870 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
1f880 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
1f890 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
1f8a0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
1f8b0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
1f8c0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1f8d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1f8e0 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
1f8f0 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
1f900 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
1f910 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1f920 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1f930 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  8]);.          r
1f940 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1f950 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
1f960 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
1f970 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f990 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f9a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f9b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f9c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f9d0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
1f9e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f9f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1fa00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1fa20 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
1fa30 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
1fa40 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1fa50 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1fa60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
1fa70 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1fa80 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1fa90 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1faa0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
1fab0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
1fac0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
1fad0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1fae0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1faf0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
1fb00 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
1fb10 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
1fb20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1fb30 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1fb40 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1fb50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1fb60 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1fb70 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
1fb80 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1fb90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1fbb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1fbc0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
1fbd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1fbe0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1fbf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1fc00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1fc20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1fc30 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1fc40 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
1fc50 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1fc60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1fc70 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1fc80 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1fc90 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1fca0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1fcb0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1fcc0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
1fcd0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1fce0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
1fcf0 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
1fd00 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
1fd10 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a     int closest;.
1fd20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
1fd30 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
1fd40 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
1fd50 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
1fd60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1fd70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fd80 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1fda0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1fdb0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1fdc0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1fdd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
1fde0 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
1fdf0 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a     int i, dist;.
1fe00 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1fe10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1fe20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
1fe30 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
1fe40 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1fe50 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
1fe60 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
1fe70 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1fe80 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
1fe90 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
1fea0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1feb0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1fed0 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
1fee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fef0 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
1ff00 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1ff10 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
1ff20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ff40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ff50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ff60 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1ff70 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1ff80 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
1ff90 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
1ffa0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
1ffb0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
1ffc0 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
1ffd0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
1ffe0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
1fff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
20000 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  Pgno>sqlite3Page
20010 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
20020 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
20030 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70         /* Free p
20040 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20  age off the end 
20050 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
20060 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
20070 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20080 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
20090 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
200a0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
200b0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
200c0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
200d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
200e0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
200f0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
20110 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
20120 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
20130 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
20140 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
20150 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
20160 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
20170 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
20180 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
20190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
201a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
201b0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
201c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
201d0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
201e0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  no, ppPage, 1);.
201f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20210 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20220 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
20230 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ack((*ppPage)->p
20240 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
20250 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20260 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
20270 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
20280 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
202a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
202b0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
202c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
202d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
202e0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
202f0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
20300 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
20320 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
20330 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
20340 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
20350 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
20360 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
20370 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
20380 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
20390 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
203a0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
203b0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
203c0 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20  e */.    *pPgno 
203d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
203e0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
203f0 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64  ger) + 1;..#ifnd
20400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20410 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
20420 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b  ( pBt->nTrunc ){
20430 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63  .      /* An inc
20440 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72  r-vacuum has alr
20450 65 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20  eady run within 
20460 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
20470 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  . So the.      *
20480 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61  * page to alloca
20490 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74  te is not from t
204a0 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20  he physical end 
204b0 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74  of the file, but
204c0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74  .      ** at pBt
204d0 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20  ->nTrunc. .     
204e0 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f   */.      *pPgno
204f0 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31   = pBt->nTrunc+1
20500 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
20510 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
20520 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
20530 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
20540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20550 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
20560 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
20570 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
20580 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
20590 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
205a0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
205b0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
205c0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
205d0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
205e0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
205f0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
20600 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
20610 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
20620 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
20630 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
20640 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
20650 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
20660 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
20670 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
20680 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
20690 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
206a0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
206b0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
206c0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
206d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
206e0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
206f0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
20700 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20710 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
20720 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
20730 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
20740 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
20750 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
20760 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20770 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
20780 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
20790 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
207a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
207b0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
207c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
207d0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
207e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
207f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20800 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
20810 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
20820 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
20830 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
20840 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
20850 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
20860 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
20870 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
20880 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
20890 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
208a0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
208b0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
208c0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
208d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
208e0 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
208f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20900 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
20910 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
20920 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
20930 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
20940 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
20950 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
20960 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
20970 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20980 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20990 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
209a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
209b0 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
209c0 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
209d0 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
209e0 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  g */.  assert( p
209f0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
20a00 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
20a10 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
20a20 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ge(pPage->pParen
20a30 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61  t);.  pPage->pPa
20a40 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rent = 0;..  /* 
20a50 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
20a60 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
20a70 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
20a80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20a90 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
20aa0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
20ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20   return rc;.  n 
20ac0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
20ad0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20ae0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
20af0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
20b00 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
20b10 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
20b20 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
20b30 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
20b40 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
20b50 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
20b60 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
20b70 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
20b80 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
20b90 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
20ba0 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  os..  */.  rc = 
20bb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20bc0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
20bd0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
20be0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65  turn rc;.  memse
20bf0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
20c00 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
20c10 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  ageSize);.#endif
20c20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20c30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20c40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
20c50 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
20c60 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
20c70 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
20c80 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
20c90 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
20ca0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
20cb0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
20cc0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
20cd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
20ce0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67  mapPut(pBt, pPag
20cf0 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  e->pgno, PTRMAP_
20d00 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
20d10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20d20 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
20d30 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ..  if( n==0 ){.
20d40 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
20d50 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
20d60 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ge */.    rc = s
20d70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20d80 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
20d90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
20da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65  eturn rc;.    me
20db0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
20dc0 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75  a, 0, 8);.    pu
20dd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
20de0 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
20df0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41  ->pgno);.    TRA
20e00 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
20e10 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61  %d first\n", pPa
20e20 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
20e30 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65  lse{.    /* Othe
20e40 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72  r free pages alr
20e50 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74  eady exist.  Ret
20e60 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74  rive the first t
20e70 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a  runk page.    **
20e80 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
20e90 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f   and find out ho
20ea0 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74  w many leaves it
20eb0 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d   has. */.    Mem
20ec0 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20  Page *pTrunk;.  
20ed0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
20ee0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
20ef0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
20f00 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
20f10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20f20 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67  rn rc;.    k = g
20f30 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
20f40 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
20f50 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62  if( k>=pBt->usab
20f60 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
20f70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
20f80 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72  nk is full.  Tur
20f90 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  n the page being
20fa0 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65   freed into a ne
20fb0 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b  w.      ** trunk
20fc0 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65   page with no le
20fd0 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  aves. */.      r
20fe0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20ff0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
21000 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
21010 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21020 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
21030 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54  pPage->aData, pT
21040 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  runk->pgno);.   
21050 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
21060 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
21070 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
21080 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
21090 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
210a0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
210b0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
210c0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
210d0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20  placing %d\n",. 
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
210f0 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b  ge->pgno, pTrunk
21100 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  ->pgno));.    }e
21110 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  lse{.      /* Ad
21120 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65  d the newly free
21130 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66  d page as a leaf
21140 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
21150 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72  trunk */.      r
21160 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21170 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
21180 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
21190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
211a0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
211b0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
211c0 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20  ta[4], k+1);.   
211d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
211e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b  Trunk->aData[8+k
211f0 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  *4], pPage->pgno
21200 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
21210 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
21220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
21230 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
21240 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23  age->pDbPage);.#
21250 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
21260 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
21270 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
21280 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
21290 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
212a0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
212b0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
212c0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
212d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
212e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
212f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
21300 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21310 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
21320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
21330 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
21340 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
21350 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
21360 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21370 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
21380 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
21390 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
213a0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
213b0 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  Ovfl;.  int ovfl
213c0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 70 61 72  PageSize;..  par
213d0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
213e0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
213f0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
21400 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
21410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21420 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
21430 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
21440 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
21450 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
21460 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
21470 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
21480 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
21490 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
214a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
214b0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
214c0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
214d0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
214e0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
214f0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
21500 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
21510 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
21520 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
21530 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
21540 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
21550 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
21560 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  flPgno>sqlite3Pa
21570 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
21580 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
21590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
215a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
215b0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
215c0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
215d0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
215e0 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
215f0 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
21600 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
21610 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
21620 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
21630 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
21640 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
21650 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
21660 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
21670 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
21680 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21690 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
216a0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
216b0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
216c0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
216d0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
216e0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
216f0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
21700 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
21710 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
21720 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
21730 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
21740 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
21750 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
21760 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
21770 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
21780 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
21790 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
217a0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
217b0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
217c0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
217d0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
217e0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
217f0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
21800 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
21810 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
21820 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
21830 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
21840 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
21850 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
21860 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
21870 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
21880 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
21890 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
218a0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
218b0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
218c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
218d0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
218e0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
218f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
21900 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
21910 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
21920 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
21930 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
21940 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
21950 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
21960 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
21970 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
21980 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
21990 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219b0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
219c0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
219d0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
219e0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
219f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21a00 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
21a10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
21a20 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
21a30 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
21a40 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
21a50 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
21a60 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
21a70 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
21a80 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
21a90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
21aa0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
21ab0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
21ac0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21ad0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21ae0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
21af0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
21b00 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
21b10 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  fo;..  /* Fill i
21b20 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
21b30 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
21b40 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
21b50 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
21b60 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
21b70 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
21b80 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
21b90 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
21ba0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
21bb0 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
21bc0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
21bd0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
21be0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
21bf0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
21c00 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
21c10 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65  nKey);.  parseCe
21c20 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
21c30 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
21c40 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
21c50 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
21c60 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
21c70 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
21c80 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
21c90 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b  ==nData+nZero );
21ca0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
21cb0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
21cc0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
21cd0 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
21ce0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
21cf0 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
21d00 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
21d10 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
21d20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
21d30 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     nPayload += n
21d40 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
21d50 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
21d60 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e   nKey;.  }.  *pn
21d70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
21d80 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
21d90 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
21da0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
21db0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
21dc0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
21dd0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
21de0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
21df0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
21e00 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
21e10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21e20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21e30 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
21e40 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
21e50 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
21e60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
21e70 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64 69  ry page */.#endi
21e80 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
21e90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
21ea0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
21eb0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
21ec0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
21ed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21ee0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
21ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
21f00 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
21f10 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
21f20 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
21f30 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
21f40 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
21f50 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
21f60 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
21f70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
21f80 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
21f90 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72 79  e now. The entry
21fa0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6f   for the first o
21fb0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69 6c  verflow page wil
21fc0 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 64  l be.      ** ad
21fd0 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74 68  ded later, by th
21fe0 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 72  e insertCell() r
21ff0 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a 2f  outine..      */
22000 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
22010 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70 67  autoVacuum && pg
22020 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20 72  noPtrmap!=0 && r
22030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22040 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
22050 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
22060 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
22070 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72 6d  RFLOW2, pgnoPtrm
22080 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ap);.      }.#en
22090 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
220a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
220b0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
220c0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
220d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
220e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
220f0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
22100 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
22110 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
22120 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
22130 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
22140 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
22150 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
22160 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
22170 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
22180 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
22190 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
221a0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
221b0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
221c0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
221d0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
221e0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
221f0 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66  paceLeft;.    if
22200 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
22210 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
22220 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
22230 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
22240 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
22250 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
22260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22270 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
22280 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
22290 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
222a0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
222b0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
222c0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
222d0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
222e0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
222f0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
22300 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
22310 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
22320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22330 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
22340 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
22350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22360 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d  .** Change the M
22370 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70  emPage.pParent p
22380 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61  ointer on the pa
22390 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20  ge whose number 
223a0 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74  is.** given in t
223b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
223c0 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61  nt so that MemPa
223d0 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  ge.pParent holds
223e0 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20   the.** pointer 
223f0 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67  in the third arg
22400 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
22410 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67   int reparentPag
22420 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
22430 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50   Pgno pgno, MemP
22440 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c  age *pNewParent,
22450 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d   int idx){.  Mem
22460 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44  Page *pThis;.  D
22470 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
22480 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 50  .  assert( pNewP
22490 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  arent!=0 );.  if
224a0 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  ( pgno==0 ) retu
224b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
224c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
224d0 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50  ger!=0 );.  pDbP
224e0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
224f0 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
22500 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
22510 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
22520 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61    pThis = (MemPa
22530 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
22540 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
22550 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69  e);.    if( pThi
22560 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  s->isInit ){.   
22570 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73     assert( pThis
22580 2d 3e 61 44 61 74 61 3d 3d 28 73 71 6c 69 74 65  ->aData==(sqlite
22590 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
225a0 62 50 61 67 65 29 29 20 29 3b 0a 20 20 20 20 20  bPage)) );.     
225b0 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
225c0 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20  ent!=pNewParent 
225d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
225e0 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20  This->pParent ) 
225f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22600 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  f(pThis->pParent
22610 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22620 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65      pThis->pPare
22630 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b  nt = pNewParent;
22640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22650 50 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72  PagerRef(pNewPar
22660 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
22670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68       }.      pTh
22680 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  is->idxParent = 
22690 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  idx;.    }.    s
226a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
226b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
226c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
226d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
226e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
226f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75  cuum ){.    retu
22700 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74  rn ptrmapPut(pBt
22710 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
22720 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74  TREE, pNewParent
22730 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e  ->pgno);.  }.#en
22740 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
22750 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
22760 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50  ** Change the pP
22770 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66  arent pointer of
22780 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
22790 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20   pPage to point 
227a0 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65  back.** to pPage
227b0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
227c0 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72   words, for ever
227d0 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65  y child of pPage
227e0 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e  , invoke reparen
227f0 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61  tPage().** to ma
22800 6b 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63  ke sure that eac
22810 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68  h child knows th
22820 61 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20  at pPage is its 
22830 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  parent..**.** Th
22840 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
22850 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75  called after you
22860 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61   memcpy() one pa
22870 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68  ge into.** anoth
22880 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
22890 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  t reparentChildP
228a0 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  ages(MemPage *pP
228b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  age){.  int i;. 
228c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
228d0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
228e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
228f0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  K;..  if( pPage-
22900 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53  >leaf ) return S
22910 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72  QLITE_OK;..  for
22920 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
22930 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
22940 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
22950 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
22960 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
22970 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
22980 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
22990 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
229a0 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b  ell), pPage, i);
229b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
229c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
229d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
229e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
229f0 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  af ){.    rc = r
22a00 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
22a10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22a20 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
22a30 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20  drOffset+8]), . 
22a40 20 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b        pPage, i);
22a50 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
22a60 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  hift = 0;.  }.  
22a70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22a80 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
22a90 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
22aa0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
22ab0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
22ac0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
22ad0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
22ae0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
22af0 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
22b00 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
22b10 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22b20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
22b30 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
22b40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
22b50 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
22b60 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
22b70 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
22b80 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
22b90 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
22ba0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
22bb0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
22bc0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
22bd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
22be0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29  int idx, int sz)
22bf0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
22c00 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
22c10 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
22c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
22c30 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
22c40 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
22c50 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
22c60 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
22c70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
22c80 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
22c90 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
22ca0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
22cb0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
22cc0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
22cd0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
22ce0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
22cf0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
22d00 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
22d10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22d20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22d30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
22d40 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
22d50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
22d60 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
22d70 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
22d80 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
22d90 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
22da0 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
22db0 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
22dc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
22dd0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
22de0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
22df0 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
22e00 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
22e10 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
22e20 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
22e30 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
22e40 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
22e50 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
22e60 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
22e70 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
22e80 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
22e90 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
22ea0 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
22eb0 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
22ec0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
22ed0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
22ee0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
22ef0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
22f00 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
22f10 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
22f20 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
22f30 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
22f40 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
22f50 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
22f60 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
22f70 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
22f80 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
22f90 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
22fa0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
22fb0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
22fc0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
22fd0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
22fe0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
22ff0 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
23000 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
23010 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
23020 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
23030 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
23040 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
23050 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
23060 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
23070 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
23080 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
23090 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
230a0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
230b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
230c0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
230d0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
230e0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
230f0 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
23100 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
23110 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
23120 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
23130 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
23140 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
23150 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
23160 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
23170 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
23180 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
23190 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
231a0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
231b0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
231c0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
231d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
231e0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
231f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
23200 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
23210 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
23220 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
23230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23240 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
23250 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
23260 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
23270 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
23280 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
23290 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
232a0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
232b0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
232c0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
232d0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
232e0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
232f0 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
23300 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
23310 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
23320 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
23330 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
23340 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
23350 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
23360 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
23370 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
23380 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
23390 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
233a0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
233b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
233c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
233d0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
233e0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
233f0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
23400 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
23410 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
23420 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
23430 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
23440 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
23450 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
23460 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
23470 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
23480 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
23490 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
234a0 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
234b0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
234c0 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
234d0 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
234e0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
234f0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
23500 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
23510 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
23520 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
23530 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
23540 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
23550 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
23560 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
23570 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
23580 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
23590 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
235a0 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
235b0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
235c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
235d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
235e0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
235f0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
23600 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
23610 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
23620 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
23630 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
23640 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
23650 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
23660 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
23670 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
23680 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
23690 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
236a0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
236b0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
236c0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
236d0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
236e0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
236f0 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
23700 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
23710 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
23720 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
23730 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
23740 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
23750 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
23760 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
23770 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
23780 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
23790 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
237a0 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
237b0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
237c0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
237d0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
237e0 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
237f0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
23800 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
23810 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
23820 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
23830 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
23840 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
23850 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
23860 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
23870 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
23880 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
23890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
238a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
238b0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
238c0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
238d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
238e0 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
238f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
23900 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
23910 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
23920 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
23930 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
23940 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
23950 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
23960 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
23970 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
23980 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
23990 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
239a0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
239b0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
239c0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
239d0 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
239e0 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
239f0 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
23a00 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
23a10 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
23a20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
23a30 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
23a40 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
23a50 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
23a60 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
23a70 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
23a80 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64  Shift = 1;.#ifnd
23a90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23aa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
23ab0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
23ac0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23ad0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
23ae0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
23af0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
23b00 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
23b10 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
23b20 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
23b30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
23b40 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
23b50 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
23b60 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
23b70 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65 43 65  o;.      parseCe
23b80 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
23b90 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
23ba0 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
23bb0 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
23bc0 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
23bd0 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
23be0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
23bf0 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
23c00 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
23c10 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
23c20 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
23c30 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
23c40 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
23c50 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
23c60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
23c70 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
23c80 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
23c90 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
23ca0 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
23cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23cc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
23cd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
23ce0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
23cf0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
23d00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23d10 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
23d20 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
23d30 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
23d40 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
23d50 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
23d60 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
23d70 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
23d80 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
23d90 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
23da0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23db0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
23dc0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
23dd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
23de0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23df0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
23e00 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
23e10 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
23e20 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
23e30 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
23e40 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  odies */.  int *
23e50 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
23e60 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
23e70 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
23e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23e90 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
23ea0 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
23eb0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
23ec0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
23ed0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
23ee0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23ef0 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
23f00 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
23f10 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
23f20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
23f30 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
23f40 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
23f50 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
23f60 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
23f70 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
23f80 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
23f90 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
23fa0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
23fb0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61  low==0 );.  tota
23fc0 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72  lSize = 0;.  for
23fd0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
23fe0 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69  ++){.    totalSi
23ff0 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  ze += aSize[i];.
24000 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f    }.  assert( to
24010 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c  talSize+2*nCell<
24020 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b  =pPage->nFree );
24030 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24040 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
24050 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d  cellptr = pPage-
24060 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64  >cellOffset;.  d
24070 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
24080 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
24090 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
240a0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
240b0 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
240c0 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20   if( nCell ){.  
240d0 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c    cellbody = all
240e0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
240f0 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20  , totalSize);.  
24100 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
24110 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dy>0 );.    asse
24120 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
24130 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20   >= 2*nCell );. 
24140 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
24150 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20  -= 2*nCell;.    
24160 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
24170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75  ; i++){.      pu
24180 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
24190 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  lptr], cellbody)
241a0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
241b0 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
241c0 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
241d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c  [i]);.      cell
241e0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ptr += 2;.      
241f0 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a  cellbody += aSiz
24200 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e[i];.    }.    
24210 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
24220 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
24230 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  ableSize );.  }.
24240 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
24250 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nCell;.}../*.**
24260 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
24270 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
24280 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
24290 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
242a0 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
242b0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
242c0 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
242d0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
242e0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
242f0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
24300 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
24310 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
24320 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
24330 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
24340 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
24350 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
24360 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
24370 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
24380 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
24390 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
243a0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
243b0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
243c0 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
243d0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
243e0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
243f0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
24400 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
24410 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
24420 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
24430 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
24440 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
24450 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
24460 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
24470 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
24480 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
24490 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
244a0 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
244b0 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
244c0 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
244d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
244e0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
244f0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
24500 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
24510 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
24520 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
24530 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
24540 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f  he balance */../
24550 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
24560 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
24570 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67  t balance(MemPag
24580 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64  e*, int);..#ifnd
24590 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
245a0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
245b0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
245c0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
245d0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
245e0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
245f0 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
24600 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
24610 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
24620 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
24630 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
24640 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
24650 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
24660 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
24670 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
24680 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
24690 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
246a0 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
246b0 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
246c0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
246d0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
246e0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
246f0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
24700 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
24710 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
24720 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
24730 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
24740 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
24750 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
24760 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
24770 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
24780 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
24790 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
247a0 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
247b0 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
247c0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
247d0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
247e0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
247f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
24800 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
24810 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
24820 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
24830 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
24840 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
24850 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
24860 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
24870 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
24880 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
24890 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
248a0 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
248b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
248c0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
248d0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d  Page *pPage, Mem
248e0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a  Page *pParent){.
248f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
24900 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e  age *pNew;.  Pgn
24910 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20  o pgnoNew;.  u8 
24920 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a  *pCell;.  int sz
24930 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  Cell;.  CellInfo
24940 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65   info;.  BtShare
24950 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
24960 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e  pBt;.  int paren
24970 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e  tIdx = pParent->
24980 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72  nCell;   /* pPar
24990 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20  ent new divider 
249a0 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
249b0 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20  int parentSize; 
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77    /* Size of new
249e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
249f0 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c  .  u8 parentCell
24a00 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [64];           
24a10 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
24a20 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  r the new divide
24a30 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  r cell */..  /* 
24a40 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
24a50 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
24a60 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
24a70 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
24a80 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
24a90 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
24aa0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
24ab0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
24ac0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
24ad0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
24ae0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
24af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24b00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24b10 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
24b20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
24b30 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
24b40 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
24b50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
24b60 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
24b70 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
24b80 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
24b90 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
24ba0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
24bb0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
24bc0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
24bd0 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
24be0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
24bf0 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
24c00 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
24c10 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
24c20 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
24c30 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
24c40 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
24c50 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
24c60 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
24c70 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
24c80 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  is.  ** so that 
24c90 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
24ca0 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
24cb0 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
24cc0 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69  and.  ** pPage i
24cd0 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
24ce0 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f  ght child. .  */
24cf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24d00 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70  ->nCell>0 );.  p
24d10 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
24d20 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
24d30 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
24d40 31 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63  1), &info);.  rc
24d50 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
24d60 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
24d70 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
24d80 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e   0, 0, 0, &paren
24d90 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  tSize);.  if( rc
24da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24db0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24dc0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65  }.  assert( pare
24dd0 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72  ntSize<64 );.  r
24de0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
24df0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
24e00 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
24e10 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
24e20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
24e40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75  urn rc;.  }.  pu
24e50 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
24e60 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
24e70 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
24e80 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34  e->pgno);.  put4
24e90 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
24ea0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
24eb0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
24ec0 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  New);..#ifndef S
24ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24ee0 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
24ef0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
24f00 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
24f10 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
24f20 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20  r map.  ** with 
24f30 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
24f40 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
24f50 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
24f60 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  he .  ** cell on
24f70 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
24f80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
24f90 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
24fa0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
24fb0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
24fc0 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
24fd0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
24fe0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
24ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25000 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
25010 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
25020 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
25030 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
25040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
25060 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
25070 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
25080 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
25090 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
250a0 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20  age and balance 
250b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
250c0 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
250d0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
250e0 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
250f0 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
25100 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  full..  */.  rel
25110 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
25120 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
25130 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a  (pParent, 0);.}.
25140 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25150 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
25160 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  CE */../*.** The
25170 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 6d 61   ISAUTOVACUUM ma
25180 63 72 6f 20 69 73 20 75 73 65 64 20 77 69 74 68  cro is used with
25190 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  in balance_nonro
251a0 6f 74 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  ot() to determin
251b0 65 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  e.** if the data
251c0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
251d0 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e 6f 74  to-vacuum or not
251e0 2e 20 42 65 63 61 75 73 65 20 69 74 20 69 73 20  . Because it is 
251f0 75 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61  used.** within a
25200 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
25210 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  t is an argument
25220 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61 63 72   to another macr
25230 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d 61 6c  o .** (sqliteMal
25240 6c 6f 63 52 61 77 29 2c 20 69 74 20 69 73 20 6e  locRaw), it is n
25250 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
25260 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  se conditional c
25270 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53  ompilation..** S
25280 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  o, this macro is
25290 20 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61 64   defined instead
252a0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
252b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
252c0 55 55 4d 0a 23 64 65 66 69 6e 65 20 49 53 41 55  UUM.#define ISAU
252d0 54 4f 56 41 43 55 55 4d 20 28 70 42 74 2d 3e 61  TOVACUUM (pBt->a
252e0 75 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c 73 65  utoVacuum).#else
252f0 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56  .#define ISAUTOV
25300 41 43 55 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a  ACUUM 0.#endif..
25310 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
25320 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
25330 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20   Cells on pPage 
25340 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73  and up to NN*2 s
25350 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50  iblings.** of pP
25360 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  age so that all 
25370 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
25380 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74   the same amount
25390 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a   of free space..
253a0 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69  ** Usually NN si
253b0 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
253c0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69   side of pPage i
253d0 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  s used in the ba
253e0 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75  lancing,.** thou
253f0 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73  gh more siblings
25400 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
25410 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61   one side if pPa
25420 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  ge is the first.
25430 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  ** or last child
25440 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
25450 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65   If pPage has fe
25460 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69  wer than 2*NN si
25470 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74  blings.** (somet
25480 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
25490 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50  nly happen if pP
254a0 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
254b0 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68  page or a .** ch
254c0 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65  ild of root) the
254d0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
254e0 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69  siblings partici
254f0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
25500 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
25510 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
25520 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67  ngs of pPage mig
25530 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
25540 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
25550 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e  one or.** two in
25560 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
25570 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
25580 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
25590 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74  r full. The root
255a0 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63   page.** is spec
255b0 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77  ial and is allow
255c0 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20  ed to be nearly 
255d0 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20  empty. If pPage 
255e0 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  is .** the root 
255f0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64  page, then the d
25600 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
25610 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
25620 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61  sed.** or decrea
25630 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e  sed by one, as n
25640 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65  ecessary, to kee
25650 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  p the root page 
25660 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76  from being.** ov
25670 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65  erfull or comple
25680 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  tely empty..**.*
25690 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
256a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
256b0 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
256c0 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50   the Cells on pP
256d0 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
256e0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
256f0 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  red in pPage->aD
25700 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e  ata[].  This can
25710 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
25720 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
25730 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65  ll.  Part of the
25740 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
25750 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61  tine is to.** ma
25760 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c  ke sure all Cell
25770 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65  s for pPage once
25780 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50   again fit in pP
25790 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a  age->aData[]..**
257a0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
257b0 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
257c0 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  he siblings of p
257d0 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74  Page, the parent
257e0 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   of pPage.** mig
257f0 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ht become overfu
25800 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
25810 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e    If that happen
25820 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
25830 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
25840 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
25850 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   the parent..**.
25860 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
25870 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
25880 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
25890 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
258a0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
258b0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53  rupted state.  S
258c0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
258d0 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
258e0 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
258f0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
25900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
25910 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65  lance_nonroot(Me
25920 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
25930 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
25940 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
25950 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
25960 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
25970 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
25980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25990 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
259a0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
259b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
259c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
259d0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
259e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
259f0 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
25a00 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
25a10 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
25a20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
25a30 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
25a60 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
25a70 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
25aa0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
25ab0 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ad0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
25ae0 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
25af0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
25b20 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
25b50 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
25b60 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
25b70 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
25b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b90 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
25ba0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
25bb0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
25bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25bd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
25be0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
25bf0 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
25c00 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
25c10 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
25c20 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
25c30 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
25c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25c50 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
25c60 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
25c70 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
25c80 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
25c90 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
25ca0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
25cb0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
25cc0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
25cd0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
25ce0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
25cf0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
25d00 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
25d10 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
25d20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
25d30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
25d40 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
25d50 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d  /.  int iSpace =
25d60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25d70 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
25d80 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b   byte of aSpace[
25d90 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
25da0 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
25db0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
25dc0 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
25dd0 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
25de0 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
25df0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
25e00 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
25e10 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
25e20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
25e30 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
25e40 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
25e50 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
25e60 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
25e70 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
25e80 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
25e90 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
25ea0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
25eb0 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
25ec0 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
25ed0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
25ee0 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
25ef0 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
25f00 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
25f10 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
25f20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
25f30 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
25f40 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
25f50 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
25f60 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
25f70 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
25f80 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
25f90 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
25fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25fb0 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
25fc0 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
25fd0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
25fe0 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26000 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
26010 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
26020 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  t *szCell;      
26030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
26040 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
26050 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
26060 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
26070 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
26080 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
26090 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
260a0 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
260b0 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20  8 *aSpace;      
260c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
260d0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70  pace to hold cop
260e0 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
260f0 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66  cells */.#ifndef
26100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26110 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46  OVACUUM.  u8 *aF
26120 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
26130 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
26140 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
26150 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
26160 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
26170 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
26180 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
26190 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
261a0 67 65 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ge) );.  pBt = p
261b0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
261c0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
261d0 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
261e0 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
261f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
26200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26210 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
26220 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
26230 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
26240 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
26250 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
26260 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
26270 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
26280 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
26290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
262a0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
262b0 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
262c0 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
262d0 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
262e0 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
262f0 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
26300 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
26310 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
26320 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
26330 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
26340 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
26350 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
26360 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
26370 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
26380 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
26390 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
263a0 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
263b0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
263c0 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
263d0 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
263e0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
263f0 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
26400 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
26410 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
26420 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
26430 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
26440 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
26450 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
26460 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
26470 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66       pPage->leaf
26480 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50  Data &&.      pP
26490 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
264a0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
264b0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
264c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
264d0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
264e0 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
264f0 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
26500 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
26510 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
26520 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
26530 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a  gno.  ){.    /*.
26540 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65      ** TODO: Che
26550 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ck the siblings 
26560 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70  to the left of p
26570 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Page. It may be 
26580 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79  that.    ** they
26590 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e   are not full an
265a0 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73  d no new page is
265b0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
265c0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c  /.    return bal
265d0 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65  ance_quick(pPage
265e0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
265f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
26600 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20  * Find the cell 
26610 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
26620 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68  ge whose left ch
26630 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a  ild points back.
26640 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20    ** to pPage.  
26650 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62  The "idx" variab
26660 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  le is the index 
26670 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49  of that cell.  I
26680 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20  f pPage.  ** is 
26690 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68  the rightmost ch
266a0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ild of pParent t
266b0 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70  hen set idx to p
266c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20  Parent->nCell . 
266d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
266e0 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20  t->idxShift ){. 
266f0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
26700 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e    pgno = pPage->
26710 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
26720 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ( pgno==sqlite3P
26730 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
26740 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
26750 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b  ;.    for(idx=0;
26760 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
26770 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20  ell; idx++){.   
26780 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
26790 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
267a0 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b  , idx))==pgno ){
267b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
267c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
267d0 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
267e0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20  arent->nCell.   
267f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74            || get
26800 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
26810 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
26820 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67  drOffset+8])==pg
26830 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no );.  }else{. 
26840 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e     idx = pPage->
26850 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a  idxParent;.  }..
26860 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61    /*.  ** Initia
26870 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73  lize variables s
26880 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
26890 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20  e safe to jump. 
268a0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
268b0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20  balance_cleanup 
268c0 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20  at any moment.. 
268d0 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65   */.  nOld = nNe
268e0 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  w = 0;.  sqlite3
268f0 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
26900 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
26910 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c  *.  ** Find sibl
26920 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61  ing pages to pPa
26930 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73  ge and the cells
26940 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74   in pParent that
26950 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65   divide.  ** the
26960 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61   siblings.  An a
26970 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
26980 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
26990 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a  gs on either.  *
269a0 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  * side of pPage.
269b0 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20    More siblings 
269c0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
269d0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
269e0 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20  , if.  ** pPage 
269f0 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
26a00 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
26a10 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
26a20 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a  de.  If pParent.
26a30 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
26a40 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
26a50 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
26a60 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
26a70 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44  aken..  */.  nxD
26a80 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20  iv = idx - NN;. 
26a90 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20   if( nxDiv + NB 
26aa0 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  > pParent->nCell
26ab0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
26ac0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d  pParent->nCell -
26ad0 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69   NB + 1;.  }.  i
26ae0 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20  f( nxDiv<0 ){.  
26af0 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
26b00 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66  .  nDiv = 0;.  f
26b10 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b  or(i=0, k=nxDiv;
26b20 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29   i<NB; i++, k++)
26b30 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72  {.    if( k<pPar
26b40 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
26b50 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
26b60 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
26b70 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b   k);.      nDiv+
26b80 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
26b90 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20   !pParent->leaf 
26ba0 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  );.      pgnoOld
26bb0 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61  [i] = get4byte(a
26bc0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  pDiv[i]);.    }e
26bd0 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65  lse if( k==pPare
26be0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
26bf0 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
26c00 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
26c10 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
26c20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
26c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26c40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26c50 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
26c60 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
26c70 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69  Old[i], &apOld[i
26c80 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  ], pParent);.   
26c90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
26ca0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
26cb0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64      apOld[i]->id
26cc0 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20  xParent = k;.   
26cd0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
26ce0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
26cf0 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
26d00 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
26d10 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
26d20 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
26d30 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
26d40 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
26d50 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
26d60 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 2 in order to 
26d70 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
26d80 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
26d90 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
26da0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26  (nMaxCells + 1)&
26db0 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~1;..  /*.  ** A
26dc0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
26dd0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
26de0 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c  res.  */.  apCel
26df0 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
26e00 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d 61  Raw( .       nMa
26e10 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
26e20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e40 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
26e50 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
26e60 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20 20  f(int)          
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
26e90 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65     + ROUND8(size
26ea0 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20  of(MemPage))*NB 
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ec0 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f       /* aCopy */
26ed0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
26ee0 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20  eSize*(5+NB)    
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
26f10 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  e */.     + (ISA
26f20 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
26f30 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20  Cells : 0)      
26f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
26f50 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  From */.  );.  i
26f60 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
26f70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26f80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
26f90 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
26fa0 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
26fb0 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (int*)&apCell[nM
26fc0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
26fd0 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
26fe0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
26ff0 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
27000 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[0] - (u8*)apCe
27010 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
27020 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
27030 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
27040 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
27050 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
27060 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
27070 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
27080 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
27090 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
270a0 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
270b0 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
270c0 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
270d0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
270e0 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
270f0 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b  aSpace = &aCopy[
27100 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
27110 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
27120 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
27130 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
27140 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
27150 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
27160 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
27170 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64  equired */.#ifnd
27180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27190 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
271a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
271b0 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
271c0 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61  aSpace[5*pBt->pa
271d0 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e  geSize];.  }.#en
271e0 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  dif.  .  /*.  **
271f0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
27200 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
27210 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  Page and its sib
27220 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b  lings into aOld[
27230 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74  ]..  ** The rest
27240 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
27250 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
27260 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
27270 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74  rather.  ** that
27280 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
27290 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
272a0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
272b0 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  l be in the.  **
272c0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
272d0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20  g overwritten.. 
272e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
272f0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
27300 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70   MemPage *p = ap
27310 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
27320 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42  ge*)&aCopy[i][pB
27330 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
27340 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
27350 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
27360 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63  eSize];.    memc
27370 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f  py(p->aData, apO
27380 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
27390 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69  t->pageSize + si
273a0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
273b0 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70      /* The memcp
273c0 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65  y() above change
273d0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  s the value of p
273e0 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68 61  ->aData so we ha
273f0 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74  ve to.    ** set
27400 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20   it again. */.  
27410 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
27420 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
27430 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize];.  }..  /
27440 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
27450 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
27460 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
27470 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
27480 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
27490 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
274a0 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
274b0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
274c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
274d0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
274e0 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
274f0 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ace[] and remove
27500 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
27510 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
27520 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
27530 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
27540 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
27550 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
27560 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
27570 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
27580 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
27590 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
275a0 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
275b0 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
275c0 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20   into aSpace[]. 
275d0 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
275e0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
275f0 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
27600 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
27610 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
27620 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
27630 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
27640 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
27650 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
27660 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
27670 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
27680 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
27690 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
276a0 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
276b0 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
276c0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
276d0 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
276e0 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
276f0 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
27700 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
27710 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
27720 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
27730 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
27740 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
27750 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
27760 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
27770 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
27780 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e  fData && pPage->
27790 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  leaf;.  for(i=0;
277a0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
277b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
277c0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
277d0 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
277e0 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
277f0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
27800 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
27810 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
27820 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
27830 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
27840 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
27850 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
27860 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
27870 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
27880 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
27890 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
278a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
278b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
278c0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
278d0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
278e0 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
278f0 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
27900 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
27910 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
27920 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
27930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
27940 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
27950 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
27960 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
27970 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27980 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
27990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
279a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
279b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
279c0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
279d0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
279e0 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  d-1 ){.      int
279f0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
27a00 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
27a10 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
27a20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
27a30 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20      /* With the 
27a40 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70  LEAFDATA flag, p
27a50 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c  Parent cells hol
27a60 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74  d only INTKEYs t
27a70 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
27a80 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
27a90 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69   keys on the chi
27aa0 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65  ld pages.  We ne
27ab0 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20  ed to remove.   
27ac0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69       ** the divi
27ad0 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  der cells from p
27ae0 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20  Parent, but the 
27af0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
27b00 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  re not.        *
27b10 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c  * added to apCel
27b20 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79  l[] because they
27b30 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
27b40 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a  of child cells..
27b50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27b60 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
27b70 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
27b80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27b90 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
27ba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27bb0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
27bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65   );.        szCe
27bd0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
27be0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
27bf0 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
27c00 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
27c10 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
27c20 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
27c30 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
27c40 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
27c50 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
27c60 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
27c70 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
27c80 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
27c90 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ion;.#ifndef SQL
27ca0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27cb0 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
27cc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
27ce0 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
27cf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
27d00 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  if.        dropC
27d10 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
27d20 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  iv, sz);.       
27d30 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
27d40 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  = leafCorrection
27d50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27d60 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70  ( get4byte(pTemp
27d70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b  )==pgnoOld[i] );
27d80 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f  .        if( !pO
27d90 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
27da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
27db0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
27dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
27dd0 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
27de0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
27df0 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
27e00 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
27e10 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
27e20 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
27e30 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
27e40 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
27e50 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
27e60 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  ta[pOld->hdrOffs
27e70 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  et+8], 4);.     
27e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27e90 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
27ea0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
27eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27ec0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
27ed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27ee0 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
27ef0 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
27f00 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
27f10 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
27f20 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
27f30 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
27f40 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
27f50 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
27f60 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
27f70 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
27f80 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
27f90 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
27fa0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
27fb0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
27fc0 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
27fd0 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
27fe0 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
27ff0 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
28000 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
28010 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
28020 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
28030 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
28040 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
28050 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
28060 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
28070 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
28080 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
28090 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
280a0 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
280b0 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
280c0 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
280d0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
280e0 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
280f0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
28100 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
28110 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
28120 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
28130 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
28140 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
28150 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
28160 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
28170 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
28180 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
28190 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
281a0 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
281b0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
281c0 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
281d0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
281e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
281f0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
28200 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
28210 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
28220 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
28230 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
28240 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
28250 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
28260 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
28270 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
28280 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
28290 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
282a0 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
282b0 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  k++;.    }.  }. 
282c0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
282d0 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
282e0 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
282f0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
28300 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
28310 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
28320 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
28330 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
28340 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
28350 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
28360 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
28370 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
28380 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
28390 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
283a0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
283b0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
283c0 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
283d0 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
283e0 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
283f0 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
28400 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
28410 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
28420 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
28430 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
28440 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
28450 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
28460 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
28470 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
28480 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
28490 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
284a0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
284b0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
284c0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
284d0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
284e0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
284f0 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
28500 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
28510 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
28520 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
28530 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
28540 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
28550 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
28560 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
28570 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
28580 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
28590 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
285a0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
285b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
285c0 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
285d0 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
285e0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28600 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
28610 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
28620 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
28630 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
28640 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
28650 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
28660 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
28670 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
28680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
28690 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
286a0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
286b0 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
286c0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
286d0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
286e0 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
286f0 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
28700 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
28710 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
28720 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
28730 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
28740 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
28750 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
28760 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
28770 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
28780 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
28790 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
287a0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
287b0 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
287c0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
287d0 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
287e0 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20   or we are the. 
287f0 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
28800 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
28810 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
28820 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
28830 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
28840 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
28850 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
28860 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
28870 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
28880 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70  ntNew[0]>0 || (p
28890 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20  Parent->pgno==1 
288a0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
288b0 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  l==0) );..  /*. 
288c0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
288d0 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
288e0 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
288f0 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
28900 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28910 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67  >pgno>1 );.  pag
28920 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e  eFlags = pPage->
28930 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
28940 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
28950 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
28960 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
28970 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
28980 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
28990 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ld[i];.      pgn
289a0 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c  oNew[i] = pgnoOl
289b0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
289c0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
289d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
289e0 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
289f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
28a00 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
28a10 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
28a20 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
28a30 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
28a40 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
28a50 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
28a60 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
28a70 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20  w, &pgnoNew[i], 
28a80 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29  pgnoNew[i-1], 0)
28a90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
28aa0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28ab0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
28ac0 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
28ad0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
28ae0 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  }.    zeroPage(p
28af0 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
28b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
28b10 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
28b20 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
28b30 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
28b40 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
28b50 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
28b60 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
28b70 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
28b80 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28b90 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
28ba0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
28bb0 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
28bc0 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
28bd0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
28be0 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
28bf0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
28c00 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
28c10 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
28c20 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
28c30 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
28c40 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
28c50 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
28c60 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
28c70 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
28c80 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
28c90 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
28ca0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
28cb0 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
28cc0 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
28cd0 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
28ce0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
28cf0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
28d00 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
28d10 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
28d20 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
28d30 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
28d40 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
28d50 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
28d60 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
28d70 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
28d80 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
28d90 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
28da0 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
28db0 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
28dc0 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
28dd0 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
28de0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
28df0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
28e00 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
28e10 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f   int minV = pgno
28e20 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  New[i];.    int 
28e30 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
28e40 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
28e50 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67  +){.      if( pg
28e60 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e  noNew[j]<(unsign
28e70 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
28e80 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
28e90 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f       minV = pgno
28ea0 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  New[j];.      }.
28eb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
28ec0 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
28ed0 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
28ee0 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
28ef0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
28f00 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
28f10 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28f20 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69  [i] = pgnoNew[mi
28f30 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
28f40 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
28f50 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28f60 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20  [minI] = t;.    
28f70 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
28f80 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
28f90 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
28fa0 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
28fb0 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
28fc0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
28fd0 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
28fe0 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20  pgnoOld[0], .   
28ff0 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f   nOld>=2 ? pgnoO
29000 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ld[1] : 0,.    n
29010 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=3 ? pgnoOld
29020 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e  [2] : 0,.    pgn
29030 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30  oNew[0], szNew[0
29040 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
29050 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c   pgnoNew[1] : 0,
29060 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
29070 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
29080 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32  w>=3 ? pgnoNew[2
29090 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  ] : 0, nNew>=3 ?
290a0 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
290b0 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e     nNew>=4 ? pgn
290c0 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[3] : 0, nNe
290d0 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
290e0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
290f0 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20   ? pgnoNew[4] : 
29100 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
29110 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
29120 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
29130 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
29140 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
29150 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
29160 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
29170 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
29180 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
29190 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
291a0 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
291b0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
291c0 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
291d0 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
291e0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
291f0 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
29200 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
29210 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
29220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29230 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e  New->pgno==pgnoN
29240 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73  ew[i] );.    ass
29250 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
29260 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
29270 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
29280 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
29290 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
292a0 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
292b0 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
292c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
292d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
292e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
292f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29300 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  M.    /* If this
29310 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
29320 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
29330 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
29340 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
29350 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
29360 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68   the siblings th
29370 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67  at were rearrang
29380 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65  ed. These can be
29390 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68  : left.    ** ch
293a0 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c  ildren of cells,
293b0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
293c0 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72   of the page, or
293d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
293e0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74      ** pointed t
293f0 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20  o by cells..    
29400 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
29410 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
29420 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63      for(k=j; k<c
29430 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a  ntNew[i]; k++){.
29440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29450 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  k<nMaxCells );. 
29460 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d         if( aFrom
29470 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [k]==0xFF || apC
29480 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70  opy[aFrom[k]]->p
29490 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
294a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
294b0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
294c0 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20  pNew, k-j);.    
294d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
294e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
294f0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
29500 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
29510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29520 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
29530 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d  .#endif..    j =
29540 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
29550 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
29560 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
29570 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
29580 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
29590 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
295a0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
295b0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
295c0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
295d0 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
295e0 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
295f0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
29600 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
29610 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
29620 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
29630 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
29640 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
29650 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
29660 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
29670 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
29680 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
29690 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
296a0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
296b0 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
296c0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
296d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
296e0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
296f0 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20 74 72 65  {../* If the tre
29700 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
29710 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
29720 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
29730 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
29740 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
29750 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
29760 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
29770 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
29780 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
29790 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
297a0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
297b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
297c0 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
297d0 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
297e0 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
297f0 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
29800 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
29810 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
29820 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
29830 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
29840 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
29850 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
29860 70 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b  pCell = &aSpace[
29870 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
29880 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
29890 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
298a0 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
298b0 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
298c0 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
298d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
298e0 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
298f0 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
29900 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
29910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29920 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
29930 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
29940 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20  Space[iSpace];. 
29950 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d         iSpace +=
29960 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
29970 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74  ert( iSpace<=pBt
29980 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a  ->pageSize*5 );.
29990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
299a0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
299b0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
299c0 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
299d0 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
299e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
299f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29a00 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  up;.      put4by
29a10 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
29a20 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69  ell(pParent,nxDi
29a30 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  v), pNew->pgno);
29a40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29a50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29a60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
29a70 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
29a80 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
29a90 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
29aa0 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
29ab0 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
29ac0 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
29ad0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
29ae0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
29af0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
29b00 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
29b10 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
29b20 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
29b30 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
29b40 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21  >autoVacuum && !
29b50 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
29b60 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29b70 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20  utOvfl(pParent, 
29b80 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20  nxDiv);.        
29b90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29ba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
29bb0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
29bc0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
29bd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29be0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
29bf0 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
29c00 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
29c10 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
29c20 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
29c30 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
29c40 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
29c50 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
29c60 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ){.    memcpy(&a
29c70 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
29c80 61 74 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b  ata[8], &apCopy[
29c90 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
29ca0 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ], 4);.  }.  if(
29cb0 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d   nxDiv==pParent-
29cc0 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e  >nCell+pParent->
29cd0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
29ce0 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
29cf0 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69  ibling is the ri
29d00 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ght-most child o
29d10 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20  f pParent */.   
29d20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
29d30 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
29d40 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
29d50 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
29d60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29d70 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
29d80 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66  bling is the lef
29d90 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66  t child of the f
29da0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50  irst entry in pP
29db0 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73  arent.    ** pas
29dc0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
29dd0 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a   divider entry *
29de0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  /.    put4byte(f
29df0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
29e00 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c  pParent, nxDiv),
29e10 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
29e20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
29e30 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64  * Reparent child
29e40 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ren of all cells
29e50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
29e60 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
29e70 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
29e80 74 43 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65  tChildPages(apNe
29e90 77 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  w[i]);.    if( r
29ea0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
29eb0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
29ec0 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nup;.  }.  rc = 
29ed0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
29ee0 65 73 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  es(pParent);.  i
29ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29f00 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
29f10 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20  cleanup;..  /*. 
29f20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20   ** Balance the 
29f30 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f  parent page.  No
29f40 74 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72  te that the curr
29f50 65 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29  ent page (pPage)
29f60 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65   might.  ** have
29f70 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74   been added to t
29f80 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69  he freelist so i
29f90 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65  t might no longe
29fa0 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  r be initialized
29fb0 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70  ..  ** But the p
29fc0 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20  arent page will 
29fd0 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61  always be initia
29fe0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  lized..  */.  as
29ff0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
2a000 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20  sInit );.  rc = 
2a010 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
2a020 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a   0);.  .  /*.  *
2a030 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
2a040 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
2a050 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
2a060 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61  :.  sqliteFree(a
2a070 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
2a080 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2a090 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2a0a0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
2a0b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
2a0c0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
2a0d0 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
2a0e0 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
2a0f0 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
2a100 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a110 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  E: finished with
2a120 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d   %d: old=%d new=
2a130 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
2a140 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2a150 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65  >pgno, nOld, nNe
2a160 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65  w, nCell));.  re
2a170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a180 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a190 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
2a1a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
2a1b0 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72  btree when the r
2a1c0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  oot.** page cont
2a1d0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20  ains no cells.  
2a1e0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72  This is an oppor
2a1f0 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74  tunity to make t
2a200 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c  he tree.** shall
2a210 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65  ower by one leve
2a220 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2a230 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2a240 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
2a250 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
2a260 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2a270 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
2a280 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
2a290 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2a2a0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
2a2b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2a2c0 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
2a2d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2a2e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2a2f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2a300 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
2a310 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
2a320 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
2a330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2a340 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
2a350 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
2a360 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
2a370 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2a380 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2a390 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
2a3a0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a3c0 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
2a3d0 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
2a3e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43  ed */.  int *szC
2a3f0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2a400 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
2a410 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2a420 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2a430 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
2a440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a450 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2a460 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2a470 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50  Bt;.  mxCellPerP
2a480 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42  age = MX_CELL(pB
2a490 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73  t);.  apCell = s
2a4a0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2a4b0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73  mxCellPerPage*(s
2a4c0 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f  izeof(u8*)+sizeo
2a4d0 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28  f(int)) );.  if(
2a4e0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74   apCell==0 ) ret
2a4f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a500 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e  ;.  szCell = (in
2a510 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c  t*)&apCell[mxCel
2a520 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28  lPerPage];.  if(
2a530 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2a540 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2a550 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
2a560 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43  mpty */.    TRAC
2a570 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70  E(("BALANCE: emp
2a580 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20  ty table %d\n", 
2a590 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2a5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2a5b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2a5c0 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e  empty but has on
2a5d0 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66  e child.  Transf
2a5e0 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e  er the.    ** in
2a5f0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2a600 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e  hat one child in
2a610 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
2a620 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77   if it .    ** w
2a630 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72  ill fit.  This r
2a640 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68  educes the depth
2a650 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20   of the tree by 
2a660 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
2a670 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
2a680 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69  age is page 1, i
2a690 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65  t has less space
2a6a0 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a   available than.
2a6b0 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64      ** its child
2a6c0 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30   (due to the 100
2a6d0 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61   byte header tha
2a6e0 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
2a6f0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
2a700 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a710 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67   fle), so it mig
2a720 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ht not be able t
2a730 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68  o hold all of th
2a740 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  e .    ** inform
2a750 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ation currently 
2a760 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2a770 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73   child.  If this
2a780 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   is the .    ** 
2a790 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  case, then do no
2a7a0 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65  t do the transfe
2a7b0 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31  r.  Leave page 1
2a7c0 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20   empty except.  
2a7d0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67    ** for the rig
2a7e0 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ht-pointer to th
2a7f0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  e child page.  T
2a800 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65  he child page be
2a810 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  comes.    ** the
2a820 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66   virtual root of
2a830 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a   the tree..    *
2a840 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  /.    pgnoChild 
2a850 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a860 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2a870 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2a880 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2a890 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73  hild>0 );.    as
2a8a0 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c  sert( pgnoChild<
2a8b0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
2a8c0 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42  ecount(pPage->pB
2a8d0 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
2a8e0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
2a8f0 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43  Page->pBt, pgnoC
2a900 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30  hild, &pChild, 0
2a910 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2a920 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2a930 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66  _balance;.    if
2a940 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  ( pPage->pgno==1
2a950 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
2a960 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
2a970 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
2a980 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2a990 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2a9a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a9b0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2a9c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2a9d0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
2a9e0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
2a9f0 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
2aa00 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
2aa10 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2aa20 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
2aa30 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
2aa40 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2aa50 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
2aa60 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2aa70 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2aa80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
2aa90 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
2aaa0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
2aab0 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
2aac0 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
2aad0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
2aae0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
2aaf0 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
2ab00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ab10 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2ab20 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2ab30 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
2ab40 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
2ab50 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
2ab60 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
2ab70 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
2ab80 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
2ab90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2aba0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2abb0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2abc0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2abd0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2abe0 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2abf0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2ac00 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2ac10 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
2ac20 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2ac30 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
2ac40 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
2ac50 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2ac60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ac70 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
2ac80 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
2ac90 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
2aca0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
2acb0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
2acc0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
2acd0 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
2ace0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
2acf0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2ad00 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
2ad10 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
2ad20 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2ad30 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
2ad40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2ad50 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
2ad60 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
2ad70 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
2ad80 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
2ad90 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2ada0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
2adb0 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
2adc0 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67      rc = initPag
2add0 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2ade0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2adf0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2ae00 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2ae10 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2ae20 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2ae30 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2ae40 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2ae60 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2ae70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2ae80 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
2ae90 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65  ChildPages(pPage
2aea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2aeb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2aec0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
2aed0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2aee0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2aef0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2af00 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2af10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
2af20 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
2af30 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  { .        rc = 
2af40 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
2af50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  age, i);.       
2af60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2af70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2af80 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2af90 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
2afa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2afb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2afc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2afd0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2afe0 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72  w_balance;.    r
2aff0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2b000 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
2b010 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
2b020 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c  qliteFree(apCell
2b030 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b040 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
2b050 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
2b060 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
2b070 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
2b080 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
2b090 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
2b0a0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
2b0b0 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
2b0c0 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
2b0d0 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
2b0e0 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
2b0f0 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
2b100 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
2b110 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
2b120 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
2b130 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
2b140 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
2b150 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
2b160 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
2b170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2b180 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
2b190 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
2b1a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2b1b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
2b1c0 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
2b1d0 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
2b1e0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
2b1f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
2b200 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2b210 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2b220 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
2b230 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2b240 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2b250 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2b260 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2b270 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
2b280 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
2b290 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
2b2a0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
2b2b0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2b2c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2b2d0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2b2e0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
2b2f0 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
2b300 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
2b310 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
2b320 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2b330 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2b340 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2b350 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62  arent */.  int b
2b360 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk;            /
2b370 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2b380 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2b390 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2b3a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b3b0 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
2b3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b3d0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
2b3e0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2b3f0 74 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  t;.  rc = alloca
2b400 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2b410 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43   &pChild, &pgnoC
2b420 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e  hild, pPage->pgn
2b430 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  o, 0);.  if( rc 
2b440 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61  ) return rc;.  a
2b450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2b460 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b470 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
2b480 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
2b490 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2b4a0 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  e;.  data = pPag
2b4b0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
2b4c0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2b4d0 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32  et;.  brk = get2
2b4e0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2b4f0 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
2b500 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
2b510 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
2b520 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
2b530 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
2b540 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
2b550 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
2b560 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
2b570 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b  , usableSize-brk
2b580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
2b590 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ild->isInit==0 )
2b5a0 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67  ;.  rc = initPag
2b5b0 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2b5c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2b5d0 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2b5e0 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
2b5f0 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
2b600 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
2b610 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2b620 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2b630 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
2b640 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2b650 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2b660 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
2b670 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
2b680 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
2b690 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b6a0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2b6b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
2b6c0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2b6d0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
2b6e0 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
2b6f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2b700 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2b710 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2b720 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
2b730 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2b740 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2b750 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2b760 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2b770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b780 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b790 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2b7a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74  acuum ){.    int
2b7b0 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   i;.    rc = ptr
2b7c0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
2b7d0 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
2b7e0 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
2b7f0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2b800 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
2b810 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66  eeper_out;.    f
2b820 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2b830 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2b840 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b850 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20  PutOvfl(pChild, 
2b860 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
2b870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b880 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b8a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
2b8b0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2b8c0 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61  t(pChild);..bala
2b8d0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20  ncedeeper_out:. 
2b8e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2b8f0 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ild);.  return r
2b900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69  c;.}../*.** Deci
2b910 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70  de if the page p
2b920 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  Page needs to be
2b930 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62   balanced.  If b
2b940 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72  alancing is.** r
2b950 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68  equired, call th
2b960 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2b970 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e  lancing routine.
2b980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2b990 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a  alance(MemPage *
2b9a0 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72  pPage, int inser
2b9b0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2b9c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2b9d0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2b9e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
2b9f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2ba00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2ba10 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
2ba20 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2ba30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ba40 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2ba50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2ba60 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
2ba70 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  wer(pPage);.    
2ba80 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
2ba90 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2baa0 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
2bab0 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50    (!insert && pP
2bac0 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
2bad0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2bae0 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
2baf0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
2bb00 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20  root(pPage);.   
2bb10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2bb20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2bb30 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
2bb40 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61   all cursors tha
2bb50 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65  t point to table
2bb60 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66   pgnoRoot..** If
2bb70 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75   any of those cu
2bb80 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65  rsors were opene
2bb90 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
2bba0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a   in a different.
2bbb0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2bbc0 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61  ection (a databa
2bbd0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  se connection th
2bbe0 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61  at shares the pa
2bbf0 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74  ger.** cache wit
2bc00 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
2bc10 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68  nnection) and th
2bc20 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  at other connect
2bc30 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69  ion .** is not i
2bc40 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  n the ReadUncomm
2bc50 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68  mitted state, th
2bc60 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2bc70 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2bc80 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a  TE_LOCKED..**.**
2bc90 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
2bca0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61  checking for rea
2bcb0 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61  d-locks (where a
2bcc0 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d   read-lock .** m
2bcd0 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70  eans a cursor op
2bce0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
2bcf0 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0) this routin
2bd00 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20  e also moves.** 
2bd10 61 6c 6c 20 63 75 72 73 6f 72 73 20 77 72 69 74  all cursors writ
2bd20 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61  e cursors so tha
2bd30 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
2bd40 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
2bd50 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65  irst Cell on the
2bd60 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69   root page.  Thi
2bd70 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
2bd80 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74  ecause an insert
2bd90 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d   .** or delete m
2bda0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
2bdb0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2bdc0 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c  on a page or del
2bdd0 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e  ete.** a page en
2bde0 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f  tirely and we do
2bdf0 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61   not want to lea
2be00 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a  ve any cursors .
2be10 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e  ** pointing to n
2be20 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65  on-existant page
2be30 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  s or cells..*/.s
2be40 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2be50 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  eadLocks(Btree *
2be60 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e  pBtree, Pgno pgn
2be70 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  oRoot, BtCursor 
2be80 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74  *pExclude){.  Bt
2be90 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
2bea0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
2beb0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
2bec0 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
2bed0 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f 72  ->pSqlite;.  for
2bee0 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2bef0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2bf00 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
2bf10 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
2bf20 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
2bf30 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2bf40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bf50 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
2bf60 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
2bf70 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2bf80 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20  ->wrFlag==0 ){. 
2bf90 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2bfa0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
2bfb0 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
2bfc0 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30    if( dbOther==0
2bfd0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62   ||.         (db
2bfe0 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
2bff0 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
2c000 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2c010 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  itted)==0) ){.  
2c020 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2c030 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
2c040 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2c050 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  ( p->pPage->pgno
2c060 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  !=p->pgnoRoot ){
2c070 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  .      moveToRoo
2c080 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
2c090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c0a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
2c0b0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
2c0c0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
2c0d0 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
2c0e0 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
2c0f0 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
2c100 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
2c110 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
2c120 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2c130 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
2c140 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
2c150 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
2c160 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2c170 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2c180 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2c190 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2c1a0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
2c1b0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
2c1c0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
2c1d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
2c1e0 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
2c1f0 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
2c200 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
2c210 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
2c220 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
2c230 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
2c240 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c250 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
2c260 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2c270 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2c280 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
2c290 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
2c2a0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
2c2b0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
2c2c0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
2c2d0 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
2c2e0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
2c2f0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
2c300 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
2c310 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
2c320 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
2c330 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c350 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
2c360 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
2c370 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
2c380 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20  nt appendBias   
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c3a0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c3b0 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
2c3c0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
2c3d0 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
2c3e0 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
2c3f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
2c400 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2c410 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
2c420 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2c430 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
2c440 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
2c450 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
2c460 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2c470 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2c480 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2c490 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2c4a0 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2c4b0 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
2c4c0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2c4d0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2c4e0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2c4f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
2c500 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2c510 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
2c520 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2c530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c540 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
2c550 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
2c560 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2c570 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2c580 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2c590 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2c5a0 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2c5b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2c5c0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2c5d0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2c5e0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2c5f0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61   */.  }..  /* Sa
2c600 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2c610 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2c620 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
2c630 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c  is table */.  cl
2c640 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2c650 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  n(pCur);.  if( .
2c660 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2c670 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2c680 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2c690 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
2c6a0 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
2c6b0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
2c6c0 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2c6d0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
2c6e0 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
2c6f0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2c700 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
2c710 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2c720 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c730 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
2c740 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c750 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
2c760 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2c770 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
2c780 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
2c790 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
2c7a0 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
2c7b0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c7c0 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
2c7d0 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
2c7e0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
2c7f0 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
2c800 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
2c810 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2c820 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2c830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c840 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2c850 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2c860 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2c870 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74   newCell = sqlit
2c880 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43  eMallocRaw( MX_C
2c890 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2c8a0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2c8b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2c8c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2c8d0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2c8e0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2c8f0 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2c900 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2c910 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2c920 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2c930 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2c940 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2c950 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2c960 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2c970 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2c980 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2c990 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2c9a0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2c9b0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
2c9c0 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2c9d0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2c9e0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2c9f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c  >nCell );.    ol
2ca00 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2ca10 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ca20 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2ca30 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ca40 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2ca50 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2ca60 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2ca70 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2ca80 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2ca90 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2caa0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2cab0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2cac0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2cad0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2cae0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2caf0 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2cb00 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2cb10 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2cb20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cb30 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2cb40 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2cb50 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2cb60 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2cb70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2cb80 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2cb90 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2cba0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2cbb0 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2cbc0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2cbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cbe0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2cbf0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2cc00 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2cc10 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2cc20 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2cc30 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2cc40 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2cc50 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2cc60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cc70 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2cc80 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2cc90 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74  _insert:.  sqlit
2cca0 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  eFree(newCell);.
2ccb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ccc0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2ccd0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2cce0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2ccf0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2cd00 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2cd10 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2cd20 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2cd30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2cd40 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2cd50 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2cd60 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2cd70 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2cd80 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2cd90 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2cda0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2cdb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2cdc0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
2cdd0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2cde0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2cdf0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2ce00 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2ce10 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2ce20 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2ce30 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2ce40 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
2ce50 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2ce60 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2ce70 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2ce80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2ce90 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2cea0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2ceb0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2cec0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2ced0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cee0 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2cef0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2cf00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2cf10 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2cf20 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2cf30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2cf40 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2cf50 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2cf60 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2cf70 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2cf80 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2cf90 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2cfa0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2cfb0 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2cfc0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2cfd0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2cfe0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2cff0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2d000 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2d010 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2d020 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2d030 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2d040 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2d050 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2d060 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2d070 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2d080 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2d090 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2d0a0 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2d0b0 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2d0c0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2d0d0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2d0e0 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2d0f0 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2d100 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2d110 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2d120 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
2d130 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2d140 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
2d150 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2d160 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2d170 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2d180 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2d190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d1a0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2d1b0 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
2d1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2d1d0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
2d1e0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
2d1f0 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  's page and leav
2d200 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2d210 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2d220 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2d230 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2d240 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2d250 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2d260 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2d270 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2d280 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2d290 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
2d2a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d2b0 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
2d2c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d2d0 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2d2e0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2d2f0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2d300 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2d310 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2d320 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
2d330 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2d340 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
2d350 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61  * The entry we a
2d360 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65  re about to dele
2d370 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
2d380 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   so if we do not
2d390 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74  .    ** do somet
2d3a0 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61  hing we will lea
2d3b0 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20  ve a hole on an 
2d3c0 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20  internal page.. 
2d3d0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
2d3e0 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62   fill the hole b
2d3f0 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65  y moving in a ce
2d400 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20  ll from a leaf. 
2d410 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   The.    ** next
2d420 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20   Cell after the 
2d430 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  one to be delete
2d440 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  d is guaranteed 
2d450 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20  to exist and.   
2d460 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66   ** to be a leaf
2d470 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69   so we can use i
2d480 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74  t..    */.    Bt
2d490 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a  Cursor leafCur;.
2d4a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2d4b0 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e  r *pNext;.    in
2d4c0 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68  t szNext;  /* Th
2d4d0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
2d4e0 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e  ng is wrong: szN
2d4f0 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20  ext is always . 
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ** initialized b
2d520 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69  efore use.  Addi
2d530 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74  ng an extra init
2d540 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
2d550 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2d560 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f  o silence the co
2d570 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77  mpiler slows dow
2d580 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  n the code. */. 
2d590 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
2d5a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2d5b0 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
2d5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2d5d0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b  age->leafData );
2d5e0 0a 20 20 20 20 67 65 74 54 65 6d 70 43 75 72 73  .    getTempCurs
2d5f0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2d600 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2d610 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2d620 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2d630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2d640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d660 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72  gerWrite(leafCur
2d670 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  .pPage->pDbPage)
2d680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d6a0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2d6b0 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2d6c0 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2d6d0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2d6e0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2d6f0 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2d700 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2d710 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2d720 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2d730 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2d740 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2d750 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2d760 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2d770 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2d780 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2d790 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2d7a0 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2d7b0 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2d7c0 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2d7d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2d7e0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2d7f0 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2d800 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73      tempCell = s
2d810 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2d820 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2d830 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ) );.      if( t
2d840 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2d850 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d860 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2d870 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2d880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d890 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2d8a0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2d8b0 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  r->idx, pNext-4,
2d8c0 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2d8d0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ell, 0);.    }. 
2d8e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d8f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
2d900 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2d910 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  lowCell(pPage, p
2d920 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43  Cur->idx), pgnoC
2d930 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20  hild);.      rc 
2d940 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2d950 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
2d960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d970 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65   ){.      dropCe
2d980 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2d990 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2d9a0 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63  zNext);.      rc
2d9b0 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43   = balance(leafC
2d9c0 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ur.pPage, 0);.  
2d9d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
2d9e0 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20  ee(tempCell);.  
2d9f0 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72    releaseTempCur
2da00 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
2da10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
2da20 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2da30 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
2da40 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2da50 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2da60 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
2da70 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
2da80 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2da90 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2daa0 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2dab0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2dac0 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
2dad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dae0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2daf0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2db00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2db10 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2db20 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2db30 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2db40 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2db50 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2db60 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2db70 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2db80 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2db90 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2dba0 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2dbb0 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2dbc0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2dbd0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2dbe0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2dbf0 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2dc00 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2dc10 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2dc20 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2dc30 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2dc40 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2dc50 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2dc60 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2dc70 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2dc80 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2dc90 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2dca0 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74  L indices.*/.int
2dcb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
2dcc0 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2dcd0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2dce0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2dcf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2dd00 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2dd10 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2dd20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2dd30 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  rc;.  if( pBt->i
2dd40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2dd50 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2dd60 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2dd70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2dd80 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  st */.    return
2dd90 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2dda0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2ddb0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2ddc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2ddd0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2dde0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2ddf0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2de00 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2de10 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2de20 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2de30 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
2de40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
2de50 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
2de60 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2de70 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
2de80 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
2de90 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
2dea0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
2deb0 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
2dec0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
2ded0 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
2dee0 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
2def0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
2df00 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
2df10 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2df20 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
2df30 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
2df40 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2df50 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
2df60 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
2df70 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2df80 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
2df90 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
2dfa0 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
2dfb0 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
2dfc0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2dfd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2dfe0 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67  etMeta(p, 4, &pg
2dff0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
2e000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e020 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..   
2e030 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74   /* The new root
2e040 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65  -page may not be
2e050 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20   allocated on a 
2e060 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2e070 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
2e080 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67  PENDING_BYTE pag
2e090 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2e0a0 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
2e0b0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
2e0c0 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
2e0d0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
2e0e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2e0f0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
2e100 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
2e110 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2e120 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
2e130 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
2e140 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
2e150 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
2e160 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
2e170 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
2e180 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
2e190 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
2e1a0 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
2e1b0 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
2e1c0 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
2e1d0 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
2e1e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
2e1f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2e200 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2e210 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2e220 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2e230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e240 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2e250 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2e260 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2e270 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
2e280 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
2e290 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
2e2a0 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
2e2b0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
2e2c0 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
2e2d0 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
2e2e0 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
2e2f0 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
2e300 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
2e310 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
2e320 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
2e330 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
2e340 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2e350 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
2e360 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
2e370 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
2e380 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
2e390 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
2e3a0 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
2e3b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
2e3c0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
2e3d0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
2e3e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e3f0 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
2e400 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
2e410 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
2e420 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
2e430 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
2e440 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2e450 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
2e460 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
2e470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e480 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2e490 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2e4a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2e4b0 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
2e4c0 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
2e4d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2e4e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2e4f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
2e500 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
2e510 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
2e520 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  GE ){.        re
2e530 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2e540 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e550 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2e560 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2e570 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
2e580 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
2e590 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2e5a0 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20  _FREEPAGE );.   
2e5b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e5c0 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2e5d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2e5e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e5f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2e600 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2e610 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e620 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2e630 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
2e640 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c  Page(pBt, pRoot,
2e650 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
2e660 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20  , pgnoMove);.   
2e670 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e680 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Root);..      /*
2e690 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   Obtain the page
2e6a0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a   at pgnoRoot */.
2e6b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e6c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e6d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2e6f0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 70 67   getPage(pBt, pg
2e700 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2e710 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2e720 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2e740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e760 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2e770 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2e780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e790 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2e7a0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2e7b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2e7c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2e7d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2e7e0 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2e7f0 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2e800 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2e810 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2e820 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2e830 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2e840 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2e850 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2e860 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2e870 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2e880 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2e890 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2e8a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2e8b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2e8c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2e8d0 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2e8e0 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2e8f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2e900 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2e910 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2e920 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2e930 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2e940 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2e950 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2e960 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2e970 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e980 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2e990 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e9a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e9b0 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2e9c0 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2e9d0 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2e9e0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2e9f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2ea00 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2ea10 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2ea20 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2ea30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ea40 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74  }../*.** Erase t
2ea50 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
2ea60 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69  e page and all i
2ea70 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65  ts children.  Re
2ea80 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  turn.** the page
2ea90 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2eaa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2eab0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2eac0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2ead0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
2eae0 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20   The BTree that 
2eaf0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62  contains the tab
2eb00 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
2eb10 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o,            /*
2eb20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
2eb30 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  clear */.  MemPa
2eb40 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
2eb50 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e   /* Parent page.
2eb60 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72    NULL for the r
2eb70 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65  oot */.  int fre
2eb80 65 50 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f  ePageFlag      /
2eb90 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67  * Deallocate pag
2eba0 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  e if true */.){.
2ebb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ebc0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2ebd0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2ebe0 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pCell;.  int i;
2ebf0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c  ..  if( pgno>sql
2ec00 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
2ec10 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
2ec20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ec30 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2ec40 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
2ec50 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2ec60 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c  t, pgno, &pPage,
2ec70 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28   pParent);.  if(
2ec80 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2ec90 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2eca0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2ecb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2ecc0 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
2ecd0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2ece0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2ecf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2ed00 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2ed10 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2ed20 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
2ed30 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2ed40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2ed50 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2ed60 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  asepage_out;.   
2ed70 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61   }.    rc = clea
2ed80 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2ed90 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2eda0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2edb0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2edc0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2edd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
2ede0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2edf0 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2ee00 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38  (&pPage->aData[8
2ee10 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ]), pPage->pPare
2ee20 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  nt, 1);.    if( 
2ee30 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2ee40 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2ee50 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
2ee60 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
2ee70 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2ee80 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
2ee90 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2eea0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2eeb0 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
2eec0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2eed0 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
2eee0 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
2eef0 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
2ef00 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
2ef10 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2ef20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2ef30 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2ef40 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2ef50 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
2ef60 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
2ef70 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
2ef80 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
2ef90 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
2efa0 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
2efb0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
2efc0 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
2efd0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2efe0 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
2eff0 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
2f000 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2f010 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2f020 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2f030 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2f040 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
2f050 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
2f060 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
2f070 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
2f080 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
2f090 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
2f0a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2f0b0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2f0c0 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74  t iTable){.  int
2f0d0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
2f0e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2f0f0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2f100 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2f110 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2f120 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2f130 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2f140 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2f150 20 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c   rc = checkReadL
2f160 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
2f170 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
2f180 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f190 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2f1a0 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c  e position of al
2f1b0 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  l cursors open o
2f1c0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  n this table */.
2f1d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2f1e0 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
2f1f0 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c  rsors(pBt, iTabl
2f200 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 72 65  e, 0)) ){.    re
2f210 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2f220 72 65 74 75 72 6e 20 63 6c 65 61 72 44 61 74 61  return clearData
2f230 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50  basePage(pBt, (P
2f240 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30  gno)iTable, 0, 0
2f250 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  );.}../*.** Eras
2f260 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
2f270 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  n in a table and
2f280 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   add the root of
2f290 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a   the table to.**
2f2a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2f2b0 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74  Except, the root
2f2c0 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c   of the principl
2f2d0 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65  e table (the one
2f2e0 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69   on.** page 1) i
2f2f0 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
2f300 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2f310 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f320 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2f330 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2f340 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2f350 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20  open.** cursors 
2f360 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  on the table..**
2f370 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
2f380 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64  M is enabled and
2f390 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61   the page at iTa
2f3a0 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  ble is not the l
2f3b0 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  ast.** root page
2f3c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f3d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
2f3e0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a  last root page .
2f3f0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2f400 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64  se file is moved
2f410 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66   into the slot f
2f420 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2f430 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e   by.** iTable an
2f440 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74  d that last slot
2f450 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
2f460 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72  ed by the last r
2f470 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  oot page.** is a
2f480 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2f490 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20  list instead of 
2f4a0 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73  iTable.  In this
2f4b0 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f   say, all.** roo
2f4c0 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74  t pages are kept
2f4d0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2f4e0 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2f4f0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a  e file, which.**
2f500 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
2f510 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20  r AUTOVACUUM to 
2f520 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69  work right.  *pi
2f530 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2f540 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d  the .** page num
2f550 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f  ber that used to
2f560 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   be the last roo
2f570 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
2f580 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  le before.** the
2f590 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61   move.  If no pa
2f5a0 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a  ge gets moved, *
2f5b0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
2f5c0 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  o 0..** The last
2f5d0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65   root page is re
2f5e0 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33  corded in meta[3
2f5f0 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ] and the value 
2f600 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73  of.** meta[3] is
2f610 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73   updated by this
2f620 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69   procedure..*/.i
2f630 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
2f640 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
2f650 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
2f660 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
2f670 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2f680 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2f690 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2f6a0 70 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70  p->pBt;..  if( p
2f6b0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2f6c0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2f6d0 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2f6e0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2f6f0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2f700 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
2f710 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
2f720 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
2f730 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
2f740 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
2f750 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
2f760 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
2f770 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
2f780 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
2f790 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
2f7a0 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
2f7b0 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
2f7c0 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
2f7d0 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
2f7e0 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
2f7f0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2f800 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
2f810 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
2f820 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
2f830 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
2f840 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f850 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
2f860 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  ..  rc = getPage
2f870 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2f880 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  le, &pPage, 0);.
2f890 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f8a0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
2f8b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2f8c0 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a  ble(p, iTable);.
2f8d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f8e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f8f0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
2f900 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
2f910 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
2f920 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
2f930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2f940 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
2f950 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2f960 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2f970 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
2f980 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2f990 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2f9a0 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
2f9b0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
2f9c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2f9d0 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
2f9e0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
2f9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fa00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2fa10 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2fa20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2fa30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2fa40 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
2fa50 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
2fa60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
2fa70 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2fa80 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
2fa90 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2faa0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
2fab0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
2fac0 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
2fad0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2fae0 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
2faf0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2fb00 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2fb10 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2fb20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2fb30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2fb40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fb50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2fb60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2fb70 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2fb80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2fb90 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
2fba0 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
2fbb0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2fbc0 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2fbd0 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2fbe0 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
2fbf0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
2fc00 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
2fc10 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
2fc20 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2fc30 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
2fc40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2fc50 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
2fc60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2fc70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2fc80 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2fc90 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
2fca0 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
2fcb0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2fcc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fcd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2fce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fcf0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
2fd00 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
2fd10 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2fd20 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  , 0, iTable);.  
2fd30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2fd40 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2fd50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2fd60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2fd70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fd80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2fd90 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2fda0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
2fdb0 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
2fdc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fdd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fde0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2fdf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2fe00 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
2fe10 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2fe20 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
2fe30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2fe40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fe50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2fe60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fe70 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
2fe80 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2fe90 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
2fea0 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
2feb0 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
2fec0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
2fed0 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
2fee0 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
2fef0 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
2ff00 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
2ff10 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
2ff20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
2ff30 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
2ff40 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
2ff50 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
2ff60 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
2ff70 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
2ff80 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
2ff90 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
2ffa0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2ffb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2ffc0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
2ffd0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2ffe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fff0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
30000 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
30010 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
30020 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
30030 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
30040 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
30050 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
30060 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30070 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
30080 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
30090 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
300a0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
300b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
300c0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
300d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
300e0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
300f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
30100 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
30110 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
30120 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
30130 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
30140 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
30150 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
30160 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
30170 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30190 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  ;  .}.../*.** Re
301a0 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f  ad the meta-info
301b0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61  rmation out of a
301c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
301d0 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74   Meta[0].** is t
301e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
301f0 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  e pages currentl
30200 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
30210 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74  e.  Meta[1].** t
30220 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20  hrough meta[15] 
30230 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  are available fo
30240 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20  r use by higher 
30250 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d  layers.  Meta[0]
30260 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  .** is read-only
30270 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65  , the others are
30280 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20   read/write..** 
30290 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c  .** The schema l
302a0 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74  ayer numbers met
302b0 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65  a values differe
302c0 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63  ntly.  At the sc
302d0 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61  hema.** layer (a
302e0 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65  nd the SetCookie
302f0 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20   and ReadCookie 
30300 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d  opcodes) the num
30310 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70  ber of.** free p
30320 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69  ages is not visi
30330 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b  ble.  So Cookie[
30340 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  0] is the same a
30350 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e  s Meta[1]..*/.in
30360 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
30370 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  tMeta(Btree *p, 
30380 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d  int idx, u32 *pM
30390 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  eta){.  DbPage *
303a0 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  pDbPage;.  int r
303b0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
303c0 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61  ar *pP1;.  BtSha
303d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
303e0 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  t;..  /* Reading
303f0 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
30400 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
30410 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
30420 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
30430 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
30440 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
30450 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
30460 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
30470 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
30480 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
30490 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
304a0 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
304b0 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
304c0 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
304d0 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
304e0 61 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c  ase by queryTabl
304f0 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b  eLock() and lock
30500 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20  Table())..  */. 
30510 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
30520 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f  Lock(p, 1, READ_
30530 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
30540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30560 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
30570 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =0 && idx<=15 );
30580 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
30590 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
305a0 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65  ger, 1, &pDbPage
305b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
305c0 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 31 20 3d  turn rc;.  pP1 =
305d0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
305e0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
305f0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
30600 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62    *pMeta = get4b
30610 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
30620 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  x*4]);.  sqlite3
30630 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
30640 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75  ge);..  /* If au
30650 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
30660 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
30670 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
30680 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
30690 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
306a0 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
306b0 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
306c0 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
306d0 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
306e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
306f0 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
30700 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
30710 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
30720 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
30730 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c   Grab the read-l
30740 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  ock on page 1. *
30750 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62  /.  rc = lockTab
30760 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  le(p, 1, READ_LO
30770 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  CK);.  return rc
30780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
30790 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
307a0 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
307b0 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
307c0 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
307d0 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
307e0 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
307f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
30800 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
30810 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
30820 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
30830 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
30840 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
30850 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
30860 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
30870 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
30880 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
30890 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
308a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
308b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
308c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
308d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
308e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
308f0 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70  pPage1!=0 );.  p
30900 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
30910 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
30920 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30930 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
30940 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
30950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30960 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33   put4byte(&pP1[3
30970 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74  6 + idx*4], iMet
30980 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  a);.  return SQL
30990 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
309a0 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67   Return the flag
309b0 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67   byte at the beg
309c0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61  inning of the pa
309d0 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ge that the curs
309e0 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
309f0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  ly pointing to..
30a00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
30a10 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f  reeFlags(BtCurso
30a20 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
30a30 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20  ODO: What about 
30a40 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
30a50 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62  EK state? Probab
30a60 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a  ly need to call.
30a70 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c    ** restoreOrCl
30a80 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
30a90 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  n() here..  */. 
30aa0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
30ab0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
30ac0 20 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20   return pPage ? 
30ad0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
30ae0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a  ge->hdrOffset] :
30af0 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
30b00 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
30b10 20 50 72 69 6e 74 20 61 20 64 69 73 61 73 73 65   Print a disasse
30b20 6d 62 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65  mbly of the give
30b30 6e 20 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61  n page on standa
30b40 72 64 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73  rd output.  This
30b50 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75   routine.** is u
30b60 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
30b70 67 20 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e  g and testing on
30b80 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
30b90 74 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28  t btreePageDump(
30ba0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
30bb0 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63  nt pgno, int rec
30bc0 75 72 73 69 76 65 2c 20 4d 65 6d 50 61 67 65 20  ursive, MemPage 
30bd0 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
30be0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
30bf0 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pPage;.  int i, 
30c00 6a 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65  j, c;.  int nFre
30c10 65 3b 0a 20 20 75 31 36 20 69 64 78 3b 0a 20 20  e;.  u16 idx;.  
30c20 69 6e 74 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e  int hdr;.  int n
30c30 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e  Cell;.  int isIn
30c40 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  it;.  unsigned c
30c50 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 63 68 61  har *data;.  cha
30c60 72 20 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75  r range[20];.  u
30c70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 61 79  nsigned char pay
30c80 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20  load[20];..  rc 
30c90 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28  = getPage(pBt, (
30ca0 50 67 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67  Pgno)pgno, &pPag
30cb0 65 2c 20 30 29 3b 0a 20 20 69 73 49 6e 69 74 20  e, 0);.  isInit 
30cc0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
30cd0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
30ce0 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Init==0 ){.    i
30cf0 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
30d00 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  Parent);.  }.  i
30d10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
30d20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 68 64  urn rc;.  }.  hd
30d30 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
30d40 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
30d50 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63  Page->aData;.  c
30d60 20 3d 20 64 61 74 61 5b 68 64 72 5d 3b 0a 20 20   = data[hdr];.  
30d70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
30d80 28 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59  (c & (PTF_INTKEY
30d90 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21  |PTF_LEAFDATA))!
30da0 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72  =0;.  pPage->zer
30db0 6f 44 61 74 61 20 3d 20 28 63 20 26 20 50 54 46  oData = (c & PTF
30dc0 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
30dd0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
30de0 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46   = (c & PTF_LEAF
30df0 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
30e00 65 2d 3e 6c 65 61 66 20 3d 20 28 63 20 26 20 50  e->leaf = (c & P
30e10 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70  TF_LEAF)!=0;.  p
30e20 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
30e30 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
30e40 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
30e50 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
30e60 66 44 61 74 61 29 29 3b 0a 20 20 6e 43 65 6c 6c  fData));.  nCell
30e70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
30e80 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 73 71 6c  a[hdr+3]);.  sql
30e90 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
30ea0 22 50 41 47 45 20 25 64 3a 20 20 66 6c 61 67 73  "PAGE %d:  flags
30eb0 3d 30 78 25 30 32 78 20 20 66 72 61 67 3d 25 64  =0x%02x  frag=%d
30ec0 20 20 20 70 61 72 65 6e 74 3d 25 64 5c 6e 22 2c     parent=%d\n",
30ed0 20 70 67 6e 6f 2c 0a 20 20 20 20 64 61 74 61 5b   pgno,.    data[
30ee0 68 64 72 5d 2c 20 64 61 74 61 5b 68 64 72 2b 37  hdr], data[hdr+7
30ef0 5d 2c 20 0a 20 20 20 20 28 70 50 61 67 65 2d 3e  ], .    (pPage->
30f00 69 73 49 6e 69 74 20 26 26 20 70 50 61 67 65 2d  isInit && pPage-
30f10 3e 70 50 61 72 65 6e 74 29 20 3f 20 70 50 61 67  >pParent) ? pPag
30f20 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
30f30 20 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28   : 0);.  assert(
30f40 20 68 64 72 20 3d 3d 20 28 70 67 6e 6f 3d 3d 31   hdr == (pgno==1
30f50 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
30f60 20 69 64 78 20 3d 20 68 64 72 20 2b 20 31 32 20   idx = hdr + 12 
30f70 2d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b  - pPage->leaf*4;
30f80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
30f90 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43  ell; i++){.    C
30fa0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
30fb0 20 20 50 67 6e 6f 20 63 68 69 6c 64 3b 0a 20 20    Pgno child;.  
30fc0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30fd0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
30fe0 73 7a 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  sz;.    int addr
30ff0 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 67 65  ;..    addr = ge
31000 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t2byte(&data[idx
31010 20 2b 20 32 2a 69 5d 29 3b 0a 20 20 20 20 70 43   + 2*i]);.    pC
31020 65 6c 6c 20 3d 20 26 64 61 74 61 5b 61 64 64 72  ell = &data[addr
31030 5d 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c  ];.    parseCell
31040 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
31050 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
31060 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
31070 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65     sprintf(range
31080 2c 22 25 64 2e 2e 25 64 22 2c 20 61 64 64 72 2c  ,"%d..%d", addr,
31090 20 61 64 64 72 2b 73 7a 2d 31 29 3b 0a 20 20 20   addr+sz-1);.   
310a0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
310b0 20 29 7b 0a 20 20 20 20 20 20 63 68 69 6c 64 20   ){.      child 
310c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
310d0 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 67 65        child = ge
310e0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
310f0 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 69 6e     }.    sz = in
31100 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66  fo.nData;.    if
31110 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
31120 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b   ) sz += info.nK
31130 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 73  ey;.    if( sz>s
31140 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31  izeof(payload)-1
31150 20 29 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 70   ) sz = sizeof(p
31160 61 79 6c 6f 61 64 29 2d 31 3b 0a 20 20 20 20 6d  ayload)-1;.    m
31170 65 6d 63 70 79 28 70 61 79 6c 6f 61 64 2c 20 26  emcpy(payload, &
31180 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 48 65 61 64  pCell[info.nHead
31190 65 72 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 66 6f  er], sz);.    fo
311a0 72 28 6a 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b  r(j=0; j<sz; j++
311b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 79  ){.      if( pay
311c0 6c 6f 61 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20  load[j]<0x20 || 
311d0 70 61 79 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66 20  payload[j]>0x7f 
311e0 29 20 70 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27  ) payload[j] = '
311f0 2e 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  .';.    }.    pa
31200 79 6c 6f 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20  yload[sz] = 0;. 
31210 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31220 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 63 65  rintf(.      "ce
31230 6c 6c 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20  ll %2d: i=%-10s 
31240 63 68 6c 64 3d 25 2d 34 64 20 6e 6b 3d 25 2d 34  chld=%-4d nk=%-4
31250 6c 6c 64 20 6e 64 3d 25 2d 34 64 20 70 61 79 6c  lld nd=%-4d payl
31260 6f 61 64 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20  oad=%s\n",.     
31270 20 69 2c 20 72 61 6e 67 65 2c 20 63 68 69 6c 64   i, range, child
31280 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 69 6e 66  , info.nKey, inf
31290 6f 2e 6e 44 61 74 61 2c 20 70 61 79 6c 6f 61 64  o.nData, payload
312a0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66  .    );.  }.  if
312b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
312c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
312d0 75 67 50 72 69 6e 74 66 28 22 72 69 67 68 74 5f  ugPrintf("right_
312e0 63 68 69 6c 64 3a 20 25 64 5c 6e 22 2c 20 67 65  child: %d\n", ge
312f0 74 34 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t4byte(&data[hdr
31300 2b 38 5d 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 72  +8]));.  }.  nFr
31310 65 65 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b  ee = 0;.  i = 0;
31320 0a 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74  .  idx = get2byt
31330 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
31340 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20  .  while( idx>0 
31350 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42  && idx<pPage->pB
31360 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
31370 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65  .    int sz = ge
31380 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t2byte(&data[idx
31390 2b 32 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  +2]);.    sprint
313a0 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22  f(range,"%d..%d"
313b0 2c 20 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31 29  , idx, idx+sz-1)
313c0 3b 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73  ;.    nFree += s
313d0 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  z;.    sqlite3De
313e0 62 75 67 50 72 69 6e 74 66 28 22 66 72 65 65 62  bugPrintf("freeb
313f0 6c 6f 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31 30  lock %2d: i=%-10
31400 73 20 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74 61  s size=%-4d tota
31410 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
31420 69 2c 20 72 61 6e 67 65 2c 20 73 7a 2c 20 6e 46  i, range, sz, nF
31430 72 65 65 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  ree);.    idx = 
31440 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
31450 64 78 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  dx]);.    i++;. 
31460 20 7d 0a 20 20 69 66 28 20 69 64 78 21 3d 30 20   }.  if( idx!=0 
31470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
31480 62 75 67 50 72 69 6e 74 66 28 22 45 52 52 4f 52  bugPrintf("ERROR
31490 3a 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  : next freeblock
314a0 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
314b0 6e 67 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78 29  nge: %d\n", idx)
314c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 63 75  ;.  }.  if( recu
314d0 72 73 69 76 65 20 26 26 20 21 70 50 61 67 65 2d  rsive && !pPage-
314e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 66 6f 72  >leaf ){.    for
314f0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
31500 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67  ++){.      unsig
31510 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 20  ned char *pCell 
31520 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31530 2c 20 69 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , i);.      btre
31540 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67  ePageDump(pBt, g
31550 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
31560 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20  1, pPage);.     
31570 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28   idx = get2byte(
31580 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  pCell);.    }.  
31590 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28    btreePageDump(
315a0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 64  pBt, get4byte(&d
315b0 61 74 61 5b 68 64 72 2b 38 5d 29 2c 20 31 2c 20  ata[hdr+8]), 1, 
315c0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50  pPage);.  }.  pP
315d0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
315e0 49 6e 69 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  Init;.  sqlite3P
315f0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
31600 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 66 66 6c  >pDbPage);.  ffl
31610 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 72  ush(stdout);.  r
31620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31630 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
31640 72 65 65 50 61 67 65 44 75 6d 70 28 42 74 72 65  reePageDump(Btre
31650 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20  e *p, int pgno, 
31660 69 6e 74 20 72 65 63 75 72 73 69 76 65 29 7b 0a  int recursive){.
31670 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
31680 67 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70  geDump(p->pBt, p
31690 67 6e 6f 2c 20 72 65 63 75 72 73 69 76 65 2c 20  gno, recursive, 
316a0 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  0);.}.#endif..#i
316b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
316c0 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
316d0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
316e0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75  /*.** Fill aResu
316f0 6c 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d  lt[] with inform
31700 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
31710 65 6e 74 72 79 20 61 6e 64 20 70 61 67 65 20 74  entry and page t
31720 68 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  hat the.** curso
31730 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
31740 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75  ..** .**   aResu
31750 6c 74 5b 30 5d 20 3d 20 20 54 68 65 20 70 61 67  lt[0] =  The pag
31760 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52  e number.**   aR
31770 65 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20  esult[1] =  The 
31780 65 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20  entry number.** 
31790 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20    aResult[2] =  
317a0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
317b0 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20  entries on this 
317c0 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c  page.**   aResul
317d0 74 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a  t[3] =  Cell siz
317e0 65 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  e (local payload
317f0 20 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20 20 20   + header).**   
31800 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75  aResult[4] =  Nu
31810 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
31820 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a  es on this page.
31830 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 35 5d 20  **   aResult[5] 
31840 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65  =  Number of fre
31850 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  e blocks on the 
31860 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c  page.**   aResul
31870 74 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61  t[6] =  Total pa
31880 79 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f 63 61  yload size (loca
31890 6c 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a  l + overflow).**
318a0 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
318b0 20 48 65 61 64 65 72 20 73 69 7a 65 20 69 6e 20   Header size in 
318c0 62 79 74 65 73 0a 2a 2a 20 20 20 61 52 65 73 75  bytes.**   aResu
318d0 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70  lt[8] =  Local p
318e0 61 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20  ayload size.**  
318f0 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50   aResult[9] =  P
31900 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
31910 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 31  r.**   aResult[1
31920 30 5d 3d 20 20 50 61 67 65 20 6e 75 6d 62 65 72  0]=  Page number
31930 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
31940 65 72 66 6c 6f 77 20 70 61 67 65 0a 2a 2a 0a 2a  erflow page.**.*
31950 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
31960 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
31970 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
31980 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   only..*/.int sq
31990 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
319a0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
319b0 43 75 72 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c  Cur, int *aResul
319c0 74 2c 20 69 6e 74 20 75 70 43 6e 74 29 7b 0a 20  t, int upCnt){. 
319d0 20 69 6e 74 20 63 6e 74 2c 20 69 64 78 3b 0a 20   int cnt, idx;. 
319e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
319f0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
31a00 20 42 74 43 75 72 73 6f 72 20 74 6d 70 43 75 72   BtCursor tmpCur
31a10 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ;..  int rc = re
31a20 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
31a30 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
31a40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
31a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
31a60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
31a70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
31a80 49 6e 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d  Init );.  getTem
31a90 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74  pCursor(pCur, &t
31aa0 6d 70 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28  mpCur);.  while(
31ab0 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20   upCnt-- ){.    
31ac0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d  moveToParent(&tm
31ad0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61  pCur);.  }.  pPa
31ae0 67 65 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67  ge = tmpCur.pPag
31af0 65 3b 0a 20 20 61 52 65 73 75 6c 74 5b 30 5d 20  e;.  aResult[0] 
31b00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
31b10 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
31b20 70 44 62 50 61 67 65 29 3b 0a 20 20 61 73 73 65  pDbPage);.  asse
31b30 72 74 28 20 61 52 65 73 75 6c 74 5b 30 5d 3d 3d  rt( aResult[0]==
31b40 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
31b50 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 74 6d   aResult[1] = tm
31b60 70 43 75 72 2e 69 64 78 3b 0a 20 20 61 52 65 73  pCur.idx;.  aRes
31b70 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[2] = pPage->
31b80 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 74 6d 70  nCell;.  if( tmp
31b90 43 75 72 2e 69 64 78 3e 3d 30 20 26 26 20 74 6d  Cur.idx>=0 && tm
31ba0 70 43 75 72 2e 69 64 78 3c 70 50 61 67 65 2d 3e  pCur.idx<pPage->
31bb0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 67 65 74  nCell ){.    get
31bc0 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70 43 75 72  CellInfo(&tmpCur
31bd0 29 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33  );.    aResult[3
31be0 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ] = tmpCur.info.
31bf0 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52 65 73 75  nSize;.    aResu
31c00 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[6] = tmpCur.i
31c10 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 61  nfo.nData;.    a
31c20 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74 6d 70 43  Result[7] = tmpC
31c30 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  ur.info.nHeader;
31c40 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20  .    aResult[8] 
31c50 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 4c  = tmpCur.info.nL
31c60 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
31c70 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20     aResult[3] = 
31c80 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36  0;.    aResult[6
31c90 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75  ] = 0;.    aResu
31ca0 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[7] = 0;.    a
31cb0 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30 3b 0a 20  Result[8] = 0;. 
31cc0 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 34 5d 20   }.  aResult[4] 
31cd0 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b 0a  = pPage->nFree;.
31ce0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 64 78    cnt = 0;.  idx
31cf0 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 61   = get2byte(&pPa
31d00 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
31d10 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d 29 3b 0a  >hdrOffset+1]);.
31d20 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26    while( idx>0 &
31d30 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74  & idx<pPage->pBt
31d40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
31d50 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69      cnt++;.    i
31d60 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  dx = get2byte(&p
31d70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 64 78 5d  Page->aData[idx]
31d80 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74  );.  }.  aResult
31d90 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20 69 66 28  [5] = cnt;.  if(
31da0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
31db0 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50 61 67 65  =0 || isRootPage
31dc0 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 61  (pPage) ){.    a
31dd0 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30 3b 0a 20  Result[9] = 0;. 
31de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73   }else{.    aRes
31df0 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[9] = pPage->
31e00 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b 0a 20  pParent->pgno;. 
31e10 20 7d 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e   }.  if( tmpCur.
31e20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
31e30 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30  {.    aResult[10
31e40 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 74 6d  ] = get4byte(&tm
31e50 70 43 75 72 2e 69 6e 66 6f 2e 70 43 65 6c 6c 5b  pCur.info.pCell[
31e60 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76 65  tmpCur.info.iOve
31e70 72 66 6c 6f 77 5d 29 3b 0a 20 20 7d 65 6c 73 65  rflow]);.  }else
31e80 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30  {.    aResult[10
31e90 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  ] = 0;.  }.  rel
31ea0 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
31eb0 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  tmpCur);.  retur
31ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
31ed0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
31ee0 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73  urn the pager as
31ef0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
31f00 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75  BTree.  This rou
31f10 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
31f20 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
31f30 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
31f40 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65  */.Pager *sqlite
31f50 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65  3BtreePager(Btre
31f60 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
31f70 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a  p->pBt->pPager;.
31f80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  }../*.** This st
31f90 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65  ructure is passe
31fa0 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67 68  d around through
31fb0 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79 20   all the sanity 
31fc0 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65  checking routine
31fd0 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  s.** in order to
31fe0 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 73   keep track of s
31ff0 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65  ome global state
32000 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
32010 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
32020 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74 65  IntegrityCk Inte
32030 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74 20  grityCk;.struct 
32040 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20 20  IntegrityCk {.  
32050 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
32060 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20 62 65    /* The tree be
32070 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75 74 20  ing checked out 
32080 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
32090 65 72 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 73  er;    /* The as
320a0 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 20  sociated pager. 
320b0 20 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65   Also accessible
320c0 20 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20   by pBt->pPager 
320d0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
320e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
320f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
32100 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
32110 6e 74 20 2a 61 6e 52 65 66 3b 20 20 20 20 20 20  nt *anRef;      
32120 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
32130 6d 65 73 20 65 61 63 68 20 70 61 67 65 20 69 73  mes each page is
32140 20 72 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20   referenced */. 
32150 20 69 6e 74 20 6d 78 45 72 72 3b 20 20 20 20 20   int mxErr;     
32160 20 20 20 2f 2a 20 53 74 6f 70 20 61 63 63 75 6d     /* Stop accum
32170 75 6c 61 74 69 6e 67 20 65 72 72 6f 72 73 20 77  ulating errors w
32180 68 65 6e 20 74 68 69 73 20 72 65 61 63 68 65 73  hen this reaches
32190 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 68 61 72 20   zero */.  char 
321a0 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f 2a 20  *zErrMsg;    /* 
321b0 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
321c0 2e 20 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 65 72  .  NULL if no er
321d0 72 6f 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 20 20  rors seen. */.  
321e0 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
321f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
32200 65 73 73 61 67 65 73 20 77 72 69 74 74 65 6e 20  essages written 
32210 74 6f 20 7a 45 72 72 4d 73 67 20 73 6f 20 66 61  to zErrMsg so fa
32220 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  r */.};..#ifndef
32230 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
32240 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
32250 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
32260 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
32270 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
32280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32290 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
322a0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
322b0 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
322c0 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
322d0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
322e0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
322f0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
32300 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  2;.  if( !pCheck
32310 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
32320 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
32330 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
32340 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
32350 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
32360 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65    zMsg2 = sqlite
32370 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
32380 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
32390 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67  (ap);.  if( zMsg
323a0 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22  1==0 ) zMsg1 = "
323b0 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  ";.  if( pCheck-
323c0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
323d0 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68  char *zOld = pCh
323e0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  eck->zErrMsg;.  
323f0 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73    pCheck->zErrMs
32400 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  g = 0;.    sqlit
32410 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68  e3SetString(&pCh
32420 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f  eck->zErrMsg, zO
32430 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c  ld, "\n", zMsg1,
32440 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
32450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
32460 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65  e(zOld);.  }else
32470 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
32480 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
32490 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  zErrMsg, zMsg1, 
324a0 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
324b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
324c0 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e  ee(zMsg2);.}.#en
324d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
324e0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
324f0 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
32500 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
32510 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
32520 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
32530 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
32540 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
32550 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
32560 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
32570 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
32580 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
32590 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
325a0 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
325b0 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
325c0 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
325d0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
325e0 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
325f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
32600 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
32610 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
32620 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
32630 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
32640 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
32650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
32660 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
32670 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69  k *pCheck, int i
32680 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
32690 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
326a0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
326b0 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
326c0 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69  heck->nPage || i
326d0 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68  Page<0 ){.    ch
326e0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
326f0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
32700 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  invalid page num
32710 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b  ber %d", iPage);
32720 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
32730 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d   }.  if( pCheck-
32740 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31  >anRef[iPage]==1
32750 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
32760 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
32770 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65  Context, "2nd re
32780 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
32790 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
327a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
327b0 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b   return  (pCheck
327c0 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b  ->anRef[iPage]++
327d0 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  )>1;.}..#ifndef 
327e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
327f0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65  VACUUM./*.** Che
32800 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ck that the entr
32810 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
32820 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43  -map for page iC
32830 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a  hild maps to .**
32840 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70   page iParent, p
32850 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54  ointer type ptrT
32860 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70  ype. If not, app
32870 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  end an error mes
32880 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63  sage.** to pChec
32890 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
328a0 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20  d checkPtrmap(. 
328b0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
328c0 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67  heck,   /* Integ
328d0 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65  rity check conte
328e0 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  xt */.  Pgno iCh
328f0 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ild,           /
32900 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  * Child page num
32910 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ber */.  u8 eTyp
32920 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
32930 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
32940 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a  ter map type */.
32950 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20    Pgno iParent, 
32960 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
32970 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
32980 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
32990 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
329a0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
329b0 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72  /* Context descr
329c0 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72  iption (used for
329d0 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29   error msg) */.)
329e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38  {.  int rc;.  u8
329f0 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20   ePtrmapType;.  
32a00 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65  Pgno iPtrmapPare
32a10 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d  nt;..  rc = ptrm
32a20 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42  apGet(pCheck->pB
32a30 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72  t, iChild, &ePtr
32a40 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61  mapType, &iPtrma
32a50 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
32a60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32a70 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
32a80 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
32a90 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f  text, "Failed to
32aa0 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79   read ptrmap key
32ab0 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20  =%d", iChild);. 
32ac0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
32ad0 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70    if( ePtrmapTyp
32ae0 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72  e!=eType || iPtr
32af0 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65  mapParent!=iPare
32b00 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  nt ){.    checkA
32b10 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32b20 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
32b30 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65    "Bad ptr map e
32b40 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65  ntry key=%d expe
32b50 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74  cted=(%d,%d) got
32b60 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20  =(%d,%d)", .    
32b70 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c    iChild, eType,
32b80 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61   iParent, ePtrma
32b90 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61  pType, iPtrmapPa
32ba0 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  rent);.  }.}.#en
32bb0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
32bc0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
32bd0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f  f the freelist o
32be0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
32bf0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56   page list..** V
32c00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
32c10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
32c20 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e  n the list is N.
32c30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32c40 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74  checkList(.  Int
32c50 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
32c60 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20  ,  /* Integrity 
32c70 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74  checking context
32c80 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65   */.  int isFree
32c90 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  List,       /* T
32ca0 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69  rue for a freeli
32cb0 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f  st.  False for o
32cc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
32cd0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  t */.  int iPage
32ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32cf0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
32d00 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68  first page in th
32d10 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
32d20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
32d30 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
32d40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
32d50 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63   the list */.  c
32d60 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
32d70 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
32d80 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
32d90 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
32da0 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64  ;.  int expected
32db0 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72   = N;.  int iFir
32dc0 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68  st = iPage;.  wh
32dd0 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20  ile( N-- > 0 && 
32de0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b  pCheck->mxErr ){
32df0 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76  .    DbPage *pOv
32e00 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69  flPage;.    unsi
32e10 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c  gned char *pOvfl
32e20 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50  Data;.    if( iP
32e30 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
32e40 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32e50 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
32e60 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
32e70 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
32e80 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
32e90 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
32ea0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
32eb0 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
32ec0 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
32ed0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
32ee0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
32ef0 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
32f00 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
32f10 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
32f20 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  rGet(pCheck->pPa
32f30 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
32f40 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b  , &pOvflPage) ){
32f50 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
32f60 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32f70 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20  ontext, "failed 
32f80 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c  to get page %d",
32f90 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62   iPage);.      b
32fa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32fb0 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73  pOvflData = (uns
32fc0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
32fd0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
32fe0 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20  (pOvflPage);.   
32ff0 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20   if( isFreeList 
33000 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
33010 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
33020 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Data[4]);.#ifnde
33030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33040 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
33050 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
33060 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
33070 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
33080 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
33090 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
330a0 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
330b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
330c0 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
330d0 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
330e0 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
330f0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
33100 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
33110 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
33120 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
33130 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
33140 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
33150 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
33160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
33180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
33190 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
331a0 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
331b0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Data[8+i*4]);.#i
331c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
331d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
331e0 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
331f0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
33200 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
33210 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
33220 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
33230 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
33240 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
33250 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
33260 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
33270 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
33280 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
33290 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
332a0 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
332b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
332c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
332d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
332e0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
332f0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
33300 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
33310 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
33320 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
33330 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
33340 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
33350 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
33360 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
33370 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
33380 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
33390 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
333a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
333b0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
333c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
333d0 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
333e0 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
333f0 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  flData);.       
33400 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
33410 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f  eck, i, PTRMAP_O
33420 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c  VERFLOW2, iPage,
33430 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
33440 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
33450 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74  .    iPage = get
33460 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
33470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
33480 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67  erUnref(pOvflPag
33490 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
334a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
334b0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
334c0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
334d0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
334e0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f  Y_CHECK./*.** Do
334f0 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20   various sanity 
33500 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67  checks on a sing
33510 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65  le page of a tre
33520 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
33530 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52  e tree depth.  R
33540 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e  oot pages return
33550 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20   0.  Parents of 
33560 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65  root pages.** re
33570 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66  turn 1, and so f
33580 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  orth..** .** The
33590 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f  se checks are do
335a0 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ne:.**.**      1
335b0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
335c0 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65  t cells and free
335d0 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76  blocks do not ov
335e0 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20  erlap.**        
335f0 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f    but combine to
33600 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65   completely cove
33610 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20  r the page..**  
33620 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72  NO  2.  Make sur
33630 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20  e cell keys are 
33640 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f  in order..**  NO
33650 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    3.  Make sure 
33660 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  no key is less t
33670 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
33680 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zLowerBound..** 
33690 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75   NO  4.  Make su
336a0 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65  re no key is gre
336b0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
336c0 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e  al to zUpperBoun
336d0 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43  d..**      5.  C
336e0 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
336f0 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  ty of overflow p
33700 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e  ages..**      6.
33710 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61    Recursively ca
33720 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  ll checkTreePage
33730 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   on all children
33740 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65  ..**      7.  Ve
33750 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
33760 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  pth of all child
33770 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e  ren is the same.
33780 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b  .**      8.  Mak
33790 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65  e sure this page
337a0 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25   is at least 33%
337b0 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74   full or else it
337c0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
337d0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
337e0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
337f0 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67  int checkTreePag
33800 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  e(.  IntegrityCk
33810 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f   *pCheck,  /* Co
33820 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61  ntext for the sa
33830 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20  nity check */.  
33840 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
33850 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33860 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
33870 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d   to check */.  M
33880 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
33890 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
338a0 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  age */.  char *z
338b0 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
338c0 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
338d0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
338e0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
338f0 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
33900 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
33910 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
33920 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
33930 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
33940 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
33950 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
33960 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
33970 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
33980 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e  ..  sprintf(zCon
33990 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
339a0 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
339b0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
339c0 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
339d0 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
339e0 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
339f0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
33a00 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
33a10 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
33a20 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
33a30 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
33a40 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
33a50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
33a60 20 28 72 63 20 3d 20 67 65 74 50 61 67 65 28 70   (rc = getPage(p
33a70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
33a80 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
33a90 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
33aa0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33ab0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
33ac0 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
33ad0 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
33ae0 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
33af0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
33b00 20 69 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50   if( (rc = initP
33b10 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
33b20 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt))!=0 ){.    c
33b30 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
33b40 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
33b50 22 69 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  "initPage() retu
33b60 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
33b70 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
33b80 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
33b90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
33ba0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
33bb0 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
33bc0 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
33bd0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
33be0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
33bf0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
33c00 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
33c10 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
33c20 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
33c30 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
33c40 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
33c50 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
33c60 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e      sprintf(zCon
33c70 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65 20 70  text, "On tree p
33c80 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
33c90 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
33ca0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
33cb0 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
33cc0 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
33cd0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
33ce0 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66  o);.    sz = inf
33cf0 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28  o.nData;.    if(
33d00 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
33d10 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65  ) sz += info.nKe
33d20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  y;.    assert( s
33d30 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  z==info.nPayload
33d40 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69   );.    if( sz>i
33d50 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
33d60 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
33d70 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  (sz - info.nLoca
33d80 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  l + usableSize -
33d90 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20   5)/(usableSize 
33da0 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f  - 4);.      Pgno
33db0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
33dc0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
33dd0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69  .iOverflow]);.#i
33de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33df0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33e00 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33e10 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33e20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
33e30 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  heck, pgnoOvfl, 
33e40 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
33e50 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
33e60 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
33e70 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69  if.      checkLi
33e80 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67  st(pCheck, 0, pg
33e90 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a  noOvfl, nPage, z
33ea0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  Context);.    }.
33eb0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61  .    /* Check sa
33ec0 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69  nity of left chi
33ed0 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ld page..    */.
33ee0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
33ef0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67  leaf ){.      pg
33f00 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
33f10 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
33f20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33f30 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
33f40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
33f50 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
33f60 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
33f70 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
33f80 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
33f90 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
33fa0 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68  if.      d2 = ch
33fb0 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
33fc0 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43  ck,pgno,pPage,zC
33fd0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69  ontext);.      i
33fe0 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65  f( i>0 && d2!=de
33ff0 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63  pth ){.        c
34000 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34010 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
34020 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74  "Child page dept
34030 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20  h differs");.   
34040 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68     }.      depth
34050 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = d2;.    }.  }
34060 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
34070 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
34080 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
34090 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
340a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
340b0 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74     sprintf(zCont
340c0 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20 25 64  ext, "On page %d
340d0 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
340e0 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
340f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34100 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
34110 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34120 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
34130 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
34140 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
34150 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
34160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
34170 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
34180 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
34190 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
341a0 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
341b0 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
341c0 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
341d0 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
341e0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
341f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
34200 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
34210 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61  qliteMalloc( usa
34220 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
34230 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73   hit ){.    mems
34240 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
34250 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
34260 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
34270 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
34280 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
34290 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
342a0 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
342b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
342c0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
342d0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
342e0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
342f0 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
34300 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65     int size = ce
34310 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
34320 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
34330 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
34340 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
34350 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
34360 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
34370 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34380 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
34390 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
343a0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
343b0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
343c0 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
343d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
343e0 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
343f0 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
34400 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
34410 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
34420 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
34430 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
34440 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
34450 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
34460 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
34470 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
34480 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
34490 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
344a0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
344b0 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
344c0 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
344d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
344e0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
344f0 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
34500 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
34510 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
34520 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
34530 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
34540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34550 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
34560 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
34570 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
34580 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
34590 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
345a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
345b0 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
345c0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
345d0 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
345e0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
345f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
34600 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
34610 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34620 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
34630 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
34640 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
34650 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
34660 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
34670 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
34680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
34690 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
346a0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
346b0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
346c0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
346d0 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
346e0 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
346f0 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
34700 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
34710 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
34720 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
34730 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
34740 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61  e(hit);..  relea
34750 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
34760 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b   return depth+1;
34770 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
34780 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
34790 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
347a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
347b0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
347c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
347d0 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c  ine does a compl
347e0 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ete check of the
347f0 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c   given BTree fil
34800 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a  e.  aRoot[] is.*
34810 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61  * an array of pa
34820 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65  ges numbers were
34830 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65   each page numbe
34840 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  r is the root pa
34850 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65  ge of.** a table
34860 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20  .  nRoot is the 
34870 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
34880 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a  s in aRoot..**.*
34890 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
348a0 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73  checks out, this
348b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
348c0 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74   NULL.  If somet
348d0 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73  hing is.** amiss
348e0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
348f0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
34900 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
34910 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
34920 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  .** and a pointe
34930 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20  r to that error 
34940 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72  message is retur
34950 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ned.  The callin
34960 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
34970 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
34980 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72   freeing the err
34990 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
349a0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63  it is done..*/.c
349b0 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
349c0 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  eIntegrityCheck(
349d0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
349e0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
349f0 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   be checked */. 
34a00 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f   int *aRoot,   /
34a10 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f  * An array of ro
34a20 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  ot pages numbers
34a30 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20   for individual 
34a40 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  trees */.  int n
34a50 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62  Root,    /* Numb
34a60 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
34a70 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e   aRoot[] */.  in
34a80 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53  t mxErr,    /* S
34a90 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72  top reporting er
34aa0 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20  rors after this 
34ab0 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  many */.  int *p
34ac0 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65  nErr    /* Write
34ad0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
34ae0 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76  s seen to this v
34af0 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ariable */.){.  
34b00 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  int i;.  int nRe
34b10 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
34b20 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61   sCheck;.  BtSha
34b30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
34b40 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  t;..  nRef = sql
34b50 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
34b60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
34b70 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
34b80 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
34b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
34ba0 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75  turn sqliteStrDu
34bb0 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
34bc0 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
34bd0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34be0 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
34bf0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
34c00 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
34c10 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
34c20 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
34c30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
34c40 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
34c50 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
34c60 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
34c70 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
34c80 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64  pnErr = 0;.#ifnd
34c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34ca0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
34cb0 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29  pBt->nTrunc!=0 )
34cc0 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61  {.    sCheck.nPa
34cd0 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ge = pBt->nTrunc
34ce0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
34cf0 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
34d00 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
34d10 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
34d20 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
34d30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61  ;.  }.  sCheck.a
34d40 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c  nRef = sqliteMal
34d50 6c 6f 63 52 61 77 28 20 28 73 43 68 65 63 6b 2e  locRaw( (sCheck.
34d60 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
34d70 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
34d80 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63   );.  if( !sChec
34d90 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75  k.anRef ){.    u
34da0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
34db0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e  ed(pBt);.    *pn
34dc0 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Err = 1;.    ret
34dd0 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  urn sqlite3MPrin
34de0 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61  tf("Unable to ma
34df0 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20  lloc %d bytes", 
34e00 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b  .        (sCheck
34e10 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
34e20 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
34e30 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ));.  }.  for(i=
34e40 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  0; i<=sCheck.nPa
34e50 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b  ge; i++){ sCheck
34e60 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d  .anRef[i] = 0; }
34e70 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42  .  i = PENDING_B
34e80 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20  YTE_PAGE(pBt);. 
34e90 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e   if( i<=sCheck.n
34ea0 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65  Page ){.    sChe
34eb0 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b  ck.anRef[i] = 1;
34ec0 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45  .  }.  sCheck.zE
34ed0 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rrMsg = 0;..  /*
34ee0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
34ef0 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
34f00 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63  list.  */.  chec
34f10 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31  kList(&sCheck, 1
34f20 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  , get4byte(&pBt-
34f30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
34f40 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2]),.           
34f50 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
34f60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
34f70 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69  ]), "Main freeli
34f80 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68  st: ");..  /* Ch
34f90 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c  eck all the tabl
34fa0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
34fb0 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73  =0; i<nRoot && s
34fc0 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
34fd0 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74  ){.    if( aRoot
34fe0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
34ff0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
35000 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35010 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
35020 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f  utoVacuum && aRo
35030 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  ot[i]>1 ){.     
35040 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43   checkPtrmap(&sC
35050 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
35060 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
35070 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   0, 0);.    }.#e
35080 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
35090 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20  eePage(&sCheck, 
350a0 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69  aRoot[i], 0, "Li
350b0 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
350c0 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
350d0 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
350e0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
350f0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
35100 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
35110 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
35120 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
35130 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
35140 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
35150 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
35160 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
35170 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
35180 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
35190 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
351a0 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
351b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
351c0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
351d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
351e0 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
351f0 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
35200 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
35210 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
35220 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
35230 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
35240 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
35250 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
35260 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
35270 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
35280 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
35290 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
352a0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
352b0 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
352c0 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
352d0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
352e0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
352f0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
35300 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
35310 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
35320 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
35330 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
35340 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
35350 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
35360 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
35370 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35380 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
35390 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
353a0 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
353b0 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
353c0 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
353d0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
353e0 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
353f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
35400 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
35410 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
35420 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
35430 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
35440 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
35450 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
35460 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
35470 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
35480 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
35490 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
354a0 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
354b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
354c0 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
354d0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
354e0 71 6c 69 74 65 46 72 65 65 28 73 43 68 65 63 6b  qliteFree(sCheck
354f0 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72  .anRef);.  *pnEr
35500 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b  r = sCheck.nErr;
35510 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b  .  return sCheck
35520 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64  .zErrMsg;.}.#end
35530 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35540 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
35550 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
35560 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
35570 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
35580 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
35590 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
355a0 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
355b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
355c0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
355d0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
355e0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
355f0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
35600 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
35610 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
35620 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
35630 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
35640 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
35650 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
35660 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
35670 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
35680 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65  GetDirname(Btree
35690 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
356a0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
356b0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
356c0 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
356d0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
356e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
356f0 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
35700 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
35710 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74  ile for this dat
35720 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72  abase. The retur
35730 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  n.** value of th
35740 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
35750 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73  e same regardles
35760 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
35770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
35780 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
35790 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e  d or not..*/.con
357a0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
357b0 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
357c0 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
357d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
357e0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
357f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
35800 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
35810 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
35820 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
35830 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
35840 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
35850 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
35860 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
35870 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
35880 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
35890 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
358a0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
358b0 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74  size of file pBt
358c0 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75  From may be redu
358d0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
358e0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
358f0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
35900 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
35910 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20  n on pBtFrom is 
35920 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
35930 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
35940 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
35950 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
35960 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
35970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
35980 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61   i, nPage, nToPa
35990 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74  ge, iSkip;..  Bt
359a0 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
359b0 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
359c0 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
359d0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69  pFrom->pBt;..  i
359e0 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21  f( pTo->inTrans!
359f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
35a00 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d  pFrom->inTrans!=
35a10 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
35a20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35a30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
35a40 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72  ( pBtTo->pCursor
35a50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
35a60 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65  _BUSY;.  nToPage
35a70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
35a80 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
35a90 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65  pPager);.  nPage
35aa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
35ab0 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
35ac0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
35ad0 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
35ae0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20  E_PAGE(pBtTo);. 
35af0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
35b00 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
35b10 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
35b20 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
35b30 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
35b40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35b60 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
35b70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
35b80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
35b90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
35ba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  = sqlite3PagerOv
35bb0 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70  erwrite(pBtTo->p
35bc0 50 61 67 65 72 2c 20 69 2c 20 73 71 6c 69 74 65  Pager, i, sqlite
35bd0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
35be0 62 50 61 67 65 29 29 3b 0a 20 20 20 20 73 71 6c  bPage));.    sql
35bf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35c00 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  DbPage);.  }..  
35c10 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
35c20 73 20 73 68 72 69 6e 6b 69 6e 67 2c 20 6a 6f 75  s shrinking, jou
35c30 72 6e 61 6c 20 74 68 65 20 70 61 67 65 73 20 74  rnal the pages t
35c40 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 74 72  hat are being tr
35c50 75 6e 63 61 74 65 64 0a 20 20 2a 2a 20 73 6f 20  uncated.  ** so 
35c60 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
35c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20   rolled back if 
35c80 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
35c90 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
35ca0 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49  Page+1; rc==SQLI
35cb0 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50  TE_OK && i<=nToP
35cc0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
35cd0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
35ce0 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
35cf0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35d10 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
35d20 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65  ger, i, &pDbPage
35d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
35d40 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
35d50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35d60 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
35d70 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
35d80 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
35d90 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74      /* Yeah.  It
35da0 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20   seems wierd to 
35db0 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29  call DontWrite()
35dc0 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69   right after Wri
35dd0 74 65 28 29 2e 20 20 42 75 74 0a 20 20 20 20 2a  te().  But.    *
35de0 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
35df0 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
35e00 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
35e10 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
35e20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
35e30 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20   what they do.  
35e40 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d  Write() really m
35e50 65 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70  eans "put this p
35e60 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  age in the.    *
35e70 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
35e80 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61  al and mark it a
35e90 73 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20  s dirty so that 
35ea0 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  it will be writt
35eb0 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  en.    ** to the
35ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
35ed0 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
35ee0 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
35ef0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
35f00 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72    ** that and pr
35f10 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20  events the page 
35f20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74  from being writt
35f30 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
35f40 73 65 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  se.  The.    ** 
35f50 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e  page is still on
35f60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
35f70 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20  urnal, though.  
35f80 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20  And that is the 
35f90 77 68 6f 6c 65 0a 20 20 20 20 2a 2a 20 70 6f 69  whole.    ** poi
35fa0 6e 74 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 3a  nt of this loop:
35fb0 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e   to put pages on
35fc0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
35fd0 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 73 71  urnal. */.    sq
35fe0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35ff0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
36000 69 66 28 20 21 72 63 20 26 26 20 6e 50 61 67 65  if( !rc && nPage
36010 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20  <nToPage ){.    
36020 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36030 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  rTruncate(pBtTo-
36040 3e 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  >pPager, nPage);
36050 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29  .  }..  if( rc )
36060 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
36070 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b  eeRollback(pTo);
36080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36090 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
360a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
360b0 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
360c0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
360d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
360e0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
360f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
36100 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
36110 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
36120 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
36130 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f  NS_WRITE));.}../
36140 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
36150 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d  zero if a statem
36160 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
36170 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
36180 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
36190 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  InStmt(Btree *p)
361a0 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  {.  return (p->p
361b0 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e  Bt && p->pBt->in
361c0 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
361d0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
361e0 69 66 20 61 20 72 65 61 64 20 28 6f 72 20 77 72  if a read (or wr
361f0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
36200 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
36210 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
36220 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72  sInReadTrans(Btr
36230 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
36240 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
36250 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
36260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
36270 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
36280 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
36290 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
362a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
362b0 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65  * a single share
362c0 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d  d-btree. The mem
362d0 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63  ory is used by c
362e0 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69  lient code for i
362f0 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f  t's own.** purpo
36300 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ses (for example
36310 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67  , to store a hig
36320 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61  h-level schema a
36330 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
36340 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ** the shared-bt
36350 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20  ree). The btree 
36360 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65  layer manages re
36370 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67  ference counting
36380 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   issues..**.** T
36390 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
363a0 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  is is called on 
363b0 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20  a shared-btree, 
363c0 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20  nBytes bytes of 
363d0 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c  memory.** are al
363e0 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c  located, zeroed,
363f0 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f   and returned to
36400 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72   the caller. For
36410 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
36420 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42   .** call the nB
36430 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
36440 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20  s ignored and a 
36450 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
36460 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d  ame blob.** of m
36470 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20  emory returned. 
36480 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f  .**.** Just befo
36490 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  re the shared-bt
364a0 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ree is closed, t
364b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73  he function pass
364c0 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46  ed as the .** xF
364d0 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65  ree argument whe
364e0 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  n the memory all
364f0 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65  ocation was made
36500 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74   is invoked on t
36510 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  he .** blob of a
36520 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
36530 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
36540 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73  hould not call s
36550 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a 20 6f  qliteFree().** o
36560 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68  n the memory, th
36570 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f  e btree layer do
36580 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64  es that..*/.void
36590 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63   *sqlite3BtreeSc
365a0 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69  hema(Btree *p, i
365b0 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28  nt nBytes, void(
365c0 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29  *xFree)(void *))
365d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
365e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
365f0 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  ( !pBt->pSchema 
36600 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68  ){.    pBt->pSch
36610 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ema = sqliteMall
36620 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  oc(nBytes);.    
36630 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
36640 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20   = xFree;.  }.  
36650 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68  return pBt->pSch
36660 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ema;.}../*.** Re
36670 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f  turn true if ano
36680 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65  ther user of the
36690 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72   same shared btr
366a0 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ee as the argume
366b0 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c  nt.** handle hol
366c0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
366d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69  lock on the sqli
366e0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
366f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
36700 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64  treeSchemaLocked
36710 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
36720 74 75 72 6e 20 28 71 75 65 72 79 54 61 62 6c 65  turn (queryTable
36730 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
36740 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
36750 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a  =SQLITE_OK);.}..
36760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36770 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
36780 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  E./*.** Obtain a
36790 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
367a0 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  le whose root pa
367b0 67 65 20 69 73 20 69 54 61 62 2e 20 20 54 68 65  ge is iTab.  The
367c0 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72  .** lock is a wr
367d0 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72  ite lock if isWr
367e0 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20  itelock is true 
367f0 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a  or a read lock.*
36800 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c 73 65  * if it is false
36810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36820 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42  BtreeLockTable(B
36830 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
36840 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  b, u8 isWriteLoc
36850 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
36860 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6c  QLITE_OK;.  u8 l
36870 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57 72 69  ockType = (isWri
36880 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43  teLock?WRITE_LOC
36890 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  K:READ_LOCK);.  
368a0 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
368b0 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ock(p, iTab, loc
368c0 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63  kType);.  if( rc
368d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
368e0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c     rc = lockTabl
368f0 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54  e(p, iTab, lockT
36900 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ype);.  }.  retu
36910 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
36920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36930 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
36940 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73  .** Argument pCs
36950 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72 73  r must be a curs
36960 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  or opened for wr
36970 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20  iting on an .** 
36980 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72  INTKEY table cur
36990 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
369a0 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65  at a valid table
369b0 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73   entry. .** This
369c0 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69   function modifi
369d0 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  es the data stor
369e0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
369f0 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c  at entry..** Onl
36a00 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74 65  y the data conte
36a10 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d  nt may only be m
36a20 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20 6e  odified, it is n
36a30 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  ot possible.** t
36a40 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65 6e  o change the len
36a50 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
36a60 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  stored..*/.int s
36a70 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
36a80 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73  ta(BtCursor *pCs
36a90 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
36aa0 33 32 20 61 6d 74 2c 20 63 6f 6e 73 74 20 76 6f  32 amt, const vo
36ab0 69 64 20 2a 7a 29 7b 0a 20 20 42 74 53 68 61 72  id *z){.  BtShar
36ac0 65 64 20 2a 70 42 74 20 3d 20 70 43 73 72 2d 3e  ed *pBt = pCsr->
36ad0 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 69  pBtree->pBt;.  i
36ae0 6e 74 20 72 63 3b 0a 0a 20 20 75 33 32 20 69 52  nt rc;..  u32 iR
36af0 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
36b00 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20 62 79   /* Remaining by
36b10 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
36b20 20 20 75 38 20 2a 7a 52 65 6d 20 3d 20 28 75 38    u8 *zRem = (u8
36b30 20 2a 29 7a 3b 20 20 20 20 2f 2a 20 50 6f 69 6e   *)z;    /* Poin
36b40 74 65 72 20 74 6f 20 64 61 74 61 20 6e 6f 74 20  ter to data not 
36b50 79 65 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  yet written */. 
36b60 20 75 33 32 20 69 4f 66 66 73 65 74 20 3d 20 6f   u32 iOffset = o
36b70 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
36b80 74 20 66 72 6f 6d 20 74 72 61 76 65 72 73 61 6c  t from traversal
36b90 20 70 6f 69 6e 74 20 74 6f 20 73 74 61 72 74 20   point to start 
36ba0 6f 66 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 50  of write */..  P
36bb0 67 6e 6f 20 69 49 64 78 20 3d 20 30 3b 20 20 20  gno iIdx = 0;   
36bc0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
36bd0 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  f overflow page 
36be0 69 6e 20 70 43 73 72 2d 3e 61 4f 76 65 72 66 6c  in pCsr->aOverfl
36bf0 6f 77 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4f 76  ow */.  Pgno iOv
36c00 66 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fl;            /
36c10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
36c20 72 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  r next overflow 
36c30 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 76  page */.  int ov
36c40 66 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  flSize;         
36c50 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74   /* Bytes of dat
36c60 61 20 70 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  a per overflow p
36c70 61 67 65 2e 20 2a 2f 0a 0a 20 20 43 65 6c 6c 49  age. */..  CellI
36c80 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 0a 20 20 2f  nfo *pInfo;..  /
36c90 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65  * Check some pre
36ca0 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a  conditions: .  *
36cb0 2a 20 20 20 28 61 29 20 61 20 77 72 69 74 65 2d  *   (a) a write-
36cc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
36cd0 70 65 6e 2c 20 0a 20 20 2a 2a 20 20 20 28 62 29  pen, .  **   (b)
36ce0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
36cf0 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  pen for writing,
36d00 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65 72  .  **   (c) ther
36d10 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63  e is no read-loc
36d20 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62  k on the table b
36d30 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e  eing modified an
36d40 64 0a 20 20 2a 2a 20 20 20 28 64 29 20 74 68 65  d.  **   (d) the
36d50 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61   cursor points a
36d60 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66  t a valid row of
36d70 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
36d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
36d90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
36da0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
36db0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
36dc0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
36dd0 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
36de0 6f 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20  o a blob */.    
36df0 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
36e00 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
36e10 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
36e20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
36e30 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
36e40 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43  nly );.  if( !pC
36e50 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  sr->wrFlag ){.  
36e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36e70 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f  PERM;   /* Curso
36e80 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77  r not open for w
36e90 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
36ea0 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
36eb0 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c  ks(pCsr->pBtree,
36ec0 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCsr->pgnoRoot,
36ed0 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20 72 65   pCsr) ){.    re
36ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
36ef0 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
36f00 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
36f10 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
36f20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73  */.  }.  if( pCs
36f30 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
36f40 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43  R_INVALID || !pC
36f50 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  sr->pPage->intKe
36f60 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
36f70 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
36f80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  }..  return acce
36f90 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20  ssPayload(pCsr, 
36fa0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
36fb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c  signed char *)z,
36fc0 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a   0, 1);.}../* .*
36fd0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20  * Set a flag on 
36fe0 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63  this cursor to c
36ff0 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  ache the locatio
37000 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d  ns of pages from
37010 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f   the .** overflo
37020 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63  w list for the c
37030 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 76  urrent row..*/.v
37040 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
37050 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74  CacheOverflow(Bt
37060 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
37070 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 63   assert(!pCur->c
37080 61 63 68 65 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  acheOverflow);. 
37090 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
370a0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75  Overflow);.  pCu
370b0 72 2d 3e 63 61 63 68 65 4f 76 65 72 66 6c 6f 77  r->cacheOverflow
370c0 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 1;.}.#endif..
370d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
370e0 69 6e 67 20 64 65 62 75 67 67 69 6e 67 20 69 6e  ing debugging in
370f0 74 65 72 66 61 63 65 20 68 61 73 20 74 6f 20 62  terface has to b
37100 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
37110 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 69  rather.** than i
37120 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
37130 74 65 73 74 31 2e 63 29 20 73 6f 20 74 68 61 74  test1.c) so that
37140 20 69 74 20 63 61 6e 20 67 65 74 20 61 63 63 65   it can get acce
37150 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20 64 65 66  ss to.** the def
37160 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74 53 68 61  inition of BtSha
37170 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  red..*/.#if defi
37180 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
37190 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
371a0 53 48 29 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63  SH).#include <tc
371b0 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69 74 65 33  l.h>.int sqlite3
371c0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
371d0 70 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  port(.  void * c
371e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
371f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
37200 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
37210 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
37220 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
37230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
37240 45 44 5f 43 41 43 48 45 0a 20 20 63 6f 6e 73 74  ED_CACHE.  const
37250 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 64   ThreadData *pTd
37260 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
37270 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  DataReadOnly();.
37280 20 20 69 66 28 20 70 54 64 2d 3e 75 73 65 53 68    if( pTd->useSh
37290 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20  aredData ){.    
372a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
372b0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
372c0 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
372d0 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 64  .    for(pBt=pTd
372e0 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70  ->pBtree; pBt; p
372f0 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
37300 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
37310 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
37320 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
37330 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
37340 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
37350 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
37360 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
37370 77 53 74 72 69 6e 67 4f 62 6a 28 7a 46 69 6c 65  wStringObj(zFile
37380 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63  , -1));.      Tc
37390 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
373a0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
373b0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
373c0 62 6a 28 70 42 74 2d 3e 6e 52 65 66 29 29 3b 0a  bj(pBt->nRef));.
373d0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65      }.    Tcl_Se
373e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
373f0 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65  p, pRet);.  }.#e
37400 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
37410 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a     L_OK;.}.#endif.