/ Hex Artifact Content
Login

Artifact 6619f15c3afacd19e42c7e01ad14df41bf2dc55d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 34 35 20 32 30 30 37 2f 30  c,v 1.345 2007/0
0190: 33 2f 32 39 20 30 35 3a 35 31 3a 34 39 20 64 72  3/29 05:51:49 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 46 6f 72 20 61 20 64 65 74 61 69  ..** For a detai
0200: 6c 65 64 20 64 69 73 63 75 73 73 69 6f 6e 20 6f  led discussion o
0210: 66 20 42 54 72 65 65 73 2c 20 72 65 66 65 72 20  f BTrees, refer 
0220: 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 6f 6e  to.**.**     Don
0230: 61 6c 64 20 45 2e 20 4b 6e 75 74 68 2c 20 54 48  ald E. Knuth, TH
0240: 45 20 41 52 54 20 4f 46 20 43 4f 4d 50 55 54 45  E ART OF COMPUTE
0250: 52 20 50 52 4f 47 52 41 4d 4d 49 4e 47 2c 20 56  R PROGRAMMING, V
0260: 6f 6c 75 6d 65 20 33 3a 0a 2a 2a 20 20 20 20 20  olume 3:.**     
0270: 22 53 6f 72 74 69 6e 67 20 41 6e 64 20 53 65 61  "Sorting And Sea
0280: 72 63 68 69 6e 67 22 2c 20 70 61 67 65 73 20 34  rching", pages 4
0290: 37 33 2d 34 38 30 2e 20 41 64 64 69 73 6f 6e 2d  73-480. Addison-
02a0: 57 65 73 6c 65 79 0a 2a 2a 20 20 20 20 20 50 75  Wesley.**     Pu
02b0: 62 6c 69 73 68 69 6e 67 20 43 6f 6d 70 61 6e 79  blishing Company
02c0: 2c 20 52 65 61 64 69 6e 67 2c 20 4d 61 73 73 61  , Reading, Massa
02d0: 63 68 75 73 65 74 74 73 2e 0a 2a 2a 0a 2a 2a 20  chusetts..**.** 
02e0: 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
02f0: 73 20 74 68 61 74 20 65 61 63 68 20 70 61 67 65  s that each page
0300: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
0310: 74 61 69 6e 73 20 4e 20 64 61 74 61 62 61 73 65  tains N database
0320: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61 6e 64 20  .** entries and 
0330: 4e 2b 31 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  N+1 pointers to 
0340: 73 75 62 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  subpages..**.** 
0350: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 0a 2a 2a 20 20 20 7c 20 20 50 74 72 28 30  --.**   |  Ptr(0
03a0: 29 20 7c 20 4b 65 79 28 30 29 20 7c 20 50 74 72  ) | Key(0) | Ptr
03b0: 28 31 29 20 7c 20 4b 65 79 28 31 29 20 7c 20 2e  (1) | Key(1) | .
03c0: 2e 2e 20 7c 20 4b 65 79 28 4e 2d 31 29 20 7c 20  .. | Key(N-1) | 
03d0: 50 74 72 28 4e 29 20 7c 0a 2a 2a 20 20 20 2d 2d  Ptr(N) |.**   --
03e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
0420: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
0430: 6b 65 79 73 20 6f 6e 20 74 68 65 20 70 61 67 65  keys on the page
0440: 20 74 68 61 74 20 50 74 72 28 30 29 20 70 6f 69   that Ptr(0) poi
0450: 6e 74 73 20 74 6f 20 68 61 76 65 20 76 61 6c 75  nts to have valu
0460: 65 73 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  es less.** than 
0470: 4b 65 79 28 30 29 2e 20 20 41 6c 6c 20 6f 66 20  Key(0).  All of 
0480: 74 68 65 20 6b 65 79 73 20 6f 6e 20 70 61 67 65  the keys on page
0490: 20 50 74 72 28 31 29 20 61 6e 64 20 69 74 73 20   Ptr(1) and its 
04a0: 73 75 62 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  subpages have.**
04b0: 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
04c0: 74 68 61 6e 20 4b 65 79 28 30 29 20 61 6e 64 20  than Key(0) and 
04d0: 6c 65 73 73 20 74 68 61 6e 20 4b 65 79 28 31 29  less than Key(1)
04e0: 2e 20 20 41 6c 6c 20 6f 66 20 74 68 65 20 6b 65  .  All of the ke
04f0: 79 73 0a 2a 2a 20 6f 6e 20 50 74 72 28 4e 29 20  ys.** on Ptr(N) 
0500: 61 6e 64 20 69 74 73 20 73 75 62 70 61 67 65 73  and its subpages
0510: 20 68 61 76 65 20 76 61 6c 75 65 73 20 67 72 65   have values gre
0520: 61 74 65 72 20 74 68 61 6e 20 4b 65 79 28 4e 2d  ater than Key(N-
0530: 31 29 2e 20 20 41 6e 64 0a 2a 2a 20 73 6f 20 66  1).  And.** so f
0540: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 64  orth..**.** Find
0550: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
0560: 20 6b 65 79 20 72 65 71 75 69 72 65 73 20 72 65   key requires re
0570: 61 64 69 6e 67 20 4f 28 6c 6f 67 28 4d 29 29 20  ading O(log(M)) 
0580: 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 0a  pages from the .
0590: 2a 2a 20 64 69 73 6b 20 77 68 65 72 65 20 4d 20  ** disk where M 
05a0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
05b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
05c0: 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  tree..**.** In t
05d0: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
05e0: 6f 6e 2c 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  on, a single fil
05f0: 65 20 63 61 6e 20 68 6f 6c 64 20 6f 6e 65 20 6f  e can hold one o
0600: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
0610: 0a 2a 2a 20 42 54 72 65 65 73 2e 20 20 45 61 63  .** BTrees.  Eac
0620: 68 20 42 54 72 65 65 20 69 73 20 69 64 65 6e 74  h BTree is ident
0630: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 64  ified by the ind
0640: 65 78 20 6f 66 20 69 74 73 20 72 6f 6f 74 20 70  ex of its root p
0650: 61 67 65 2e 20 20 54 68 65 0a 2a 2a 20 6b 65 79  age.  The.** key
0660: 20 61 6e 64 20 64 61 74 61 20 66 6f 72 20 61 6e   and data for an
0670: 79 20 65 6e 74 72 79 20 61 72 65 20 63 6f 6d 62  y entry are comb
0680: 69 6e 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  ined to form the
0690: 20 22 70 61 79 6c 6f 61 64 22 2e 20 20 41 0a 2a   "payload".  A.*
06a0: 2a 20 66 69 78 65 64 20 61 6d 6f 75 6e 74 20 6f  * fixed amount o
06b0: 66 20 70 61 79 6c 6f 61 64 20 63 61 6e 20 62 65  f payload can be
06c0: 20 63 61 72 72 69 65 64 20 64 69 72 65 63 74 6c   carried directl
06d0: 79 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  y on the databas
06e0: 65 0a 2a 2a 20 70 61 67 65 2e 20 20 49 66 20 74  e.** page.  If t
06f0: 68 65 20 70 61 79 6c 6f 61 64 20 69 73 20 6c 61  he payload is la
0700: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  rger than the pr
0710: 65 73 65 74 20 61 6d 6f 75 6e 74 20 74 68 65 6e  eset amount then
0720: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 62 79 74 65   surplus.** byte
0730: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
0740: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
0750: 20 54 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   The payload for
0760: 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 61 6e 64   an entry.** and
0770: 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 70   the preceding p
0780: 6f 69 6e 74 65 72 20 61 72 65 20 63 6f 6d 62 69  ointer are combi
0790: 6e 65 64 20 74 6f 20 66 6f 72 6d 20 61 20 22 43  ned to form a "C
07a0: 65 6c 6c 22 2e 20 20 45 61 63 68 20 0a 2a 2a 20  ell".  Each .** 
07b0: 70 61 67 65 20 68 61 73 20 61 20 73 6d 61 6c 6c  page has a small
07c0: 20 68 65 61 64 65 72 20 77 68 69 63 68 20 63 6f   header which co
07d0: 6e 74 61 69 6e 73 20 74 68 65 20 50 74 72 28 4e  ntains the Ptr(N
07e0: 29 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 6f 74  ) pointer and ot
07f0: 68 65 72 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  her.** informati
0800: 6f 6e 20 73 75 63 68 20 61 73 20 74 68 65 20 73  on such as the s
0810: 69 7a 65 20 6f 66 20 6b 65 79 20 61 6e 64 20 64  ize of key and d
0820: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 46 4f 52 4d 41  ata..**.** FORMA
0830: 54 20 44 45 54 41 49 4c 53 0a 2a 2a 0a 2a 2a 20  T DETAILS.**.** 
0840: 54 68 65 20 66 69 6c 65 20 69 73 20 64 69 76 69  The file is divi
0850: 64 65 64 20 69 6e 74 6f 20 70 61 67 65 73 2e 20  ded into pages. 
0860: 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65 20   The first page 
0870: 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 31  is called page 1
0880: 2c 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  ,.** the second 
0890: 69 73 20 70 61 67 65 20 32 2c 20 61 6e 64 20 73  is page 2, and s
08a0: 6f 20 66 6f 72 74 68 2e 20 20 41 20 70 61 67 65  o forth.  A page
08b0: 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20   number of zero 
08c0: 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 22 6e 6f  indicates.** "no
08d0: 20 73 75 63 68 20 70 61 67 65 22 2e 20 20 54 68   such page".  Th
08e0: 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e 20  e page size can 
08f0: 62 65 20 61 6e 79 74 68 69 6e 67 20 62 65 74 77  be anything betw
0900: 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
0910: 36 2e 0a 2a 2a 20 45 61 63 68 20 70 61 67 65 20  6..** Each page 
0920: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
0930: 62 74 72 65 65 20 70 61 67 65 2c 20 61 20 66 72  btree page, a fr
0940: 65 65 6c 69 73 74 20 70 61 67 65 20 6f 72 20 61  eelist page or a
0950: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
0960: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
0970: 72 73 74 20 70 61 67 65 20 69 73 20 61 6c 77 61  rst page is alwa
0980: 79 73 20 61 20 62 74 72 65 65 20 70 61 67 65 2e  ys a btree page.
0990: 20 20 54 68 65 20 66 69 72 73 74 20 31 30 30 20    The first 100 
09a0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 66 69 72  bytes of the fir
09b0: 73 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61  st.** page conta
09c0: 69 6e 20 61 20 73 70 65 63 69 61 6c 20 68 65 61  in a special hea
09d0: 64 65 72 20 28 74 68 65 20 22 66 69 6c 65 20 68  der (the "file h
09e0: 65 61 64 65 72 22 29 20 74 68 61 74 20 64 65 73  eader") that des
09f0: 63 72 69 62 65 73 20 74 68 65 20 66 69 6c 65 2e  cribes the file.
0a00: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 6f  .** The format o
0a10: 66 20 74 68 65 20 66 69 6c 65 20 68 65 61 64 65  f the file heade
0a20: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
0a30: 0a 2a 2a 0a 2a 2a 20 20 20 4f 46 46 53 45 54 20  .**.**   OFFSET 
0a40: 20 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49    SIZE    DESCRI
0a50: 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 30 20  PTION.**      0 
0a60: 20 20 20 20 20 31 36 20 20 20 20 20 48 65 61 64       16     Head
0a70: 65 72 20 73 74 72 69 6e 67 3a 20 22 53 51 4c 69  er string: "SQLi
0a80: 74 65 20 66 6f 72 6d 61 74 20 33 5c 30 30 30 22  te format 3\000"
0a90: 0a 2a 2a 20 20 20 20 20 31 36 20 20 20 20 20 20  .**     16      
0aa0: 20 32 20 20 20 20 20 50 61 67 65 20 73 69 7a 65   2     Page size
0ab0: 20 69 6e 20 62 79 74 65 73 2e 20 20 0a 2a 2a 20   in bytes.  .** 
0ac0: 20 20 20 20 31 38 20 20 20 20 20 20 20 31 20 20      18       1  
0ad0: 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 77     File format w
0ae0: 72 69 74 65 20 76 65 72 73 69 6f 6e 0a 2a 2a 20  rite version.** 
0af0: 20 20 20 20 31 39 20 20 20 20 20 20 20 31 20 20      19       1  
0b00: 20 20 20 46 69 6c 65 20 66 6f 72 6d 61 74 20 72     File format r
0b10: 65 61 64 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 20  ead version.**  
0b20: 20 20 20 32 30 20 20 20 20 20 20 20 31 20 20 20     20       1   
0b30: 20 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65    Bytes of unuse
0b40: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  d space at the e
0b50: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 0a  nd of each page.
0b60: 2a 2a 20 20 20 20 20 32 31 20 20 20 20 20 20 20  **     21       
0b70: 31 20 20 20 20 20 4d 61 78 20 65 6d 62 65 64 64  1     Max embedd
0b80: 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  ed payload fract
0b90: 69 6f 6e 0a 2a 2a 20 20 20 20 20 32 32 20 20 20  ion.**     22   
0ba0: 20 20 20 20 31 20 20 20 20 20 4d 69 6e 20 65 6d      1     Min em
0bb0: 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20 66  bedded payload f
0bc0: 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 32  raction.**     2
0bd0: 33 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 69  3       1     Mi
0be0: 6e 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  n leaf payload f
0bf0: 72 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 32  raction.**     2
0c00: 34 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69  4       4     Fi
0c10: 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
0c20: 72 0a 2a 2a 20 20 20 20 20 32 38 20 20 20 20 20  r.**     28     
0c30: 20 20 34 20 20 20 20 20 52 65 73 65 72 76 65 64    4     Reserved
0c40: 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 0a   for future use.
0c50: 2a 2a 20 20 20 20 20 33 32 20 20 20 20 20 20 20  **     32       
0c60: 34 20 20 20 20 20 46 69 72 73 74 20 66 72 65 65  4     First free
0c70: 6c 69 73 74 20 70 61 67 65 0a 2a 2a 20 20 20 20  list page.**    
0c80: 20 33 36 20 20 20 20 20 20 20 34 20 20 20 20 20   36       4     
0c90: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 6c 69  Number of freeli
0ca0: 73 74 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  st pages in the 
0cb0: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 34 30 20 20  file.**     40  
0cc0: 20 20 20 20 36 30 20 20 20 20 20 31 35 20 34 2d      60     15 4-
0cd0: 62 79 74 65 20 6d 65 74 61 20 76 61 6c 75 65 73  byte meta values
0ce0: 20 70 61 73 73 65 64 20 74 6f 20 68 69 67 68 65   passed to highe
0cf0: 72 20 6c 61 79 65 72 73 0a 2a 2a 0a 2a 2a 20 41  r layers.**.** A
0d00: 6c 6c 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ll of the intege
0d10: 72 20 76 61 6c 75 65 73 20 61 72 65 20 62 69 67  r values are big
0d20: 2d 65 6e 64 69 61 6e 20 28 6d 6f 73 74 20 73 69  -endian (most si
0d30: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 66  gnificant byte f
0d40: 69 72 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irst)..**.** The
0d50: 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
0d60: 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  nter is incremen
0d70: 74 65 64 20 77 68 65 6e 20 74 68 65 20 64 61 74  ted when the dat
0d80: 61 62 61 73 65 20 69 73 20 63 68 61 6e 67 65 64  abase is changed
0d90: 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
0da0: 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
0db0: 6d 65 20 73 65 63 6f 6e 64 2e 20 20 54 68 69 73  me second.  This
0dc0: 20 63 6f 75 6e 74 65 72 2c 20 74 6f 67 65 74 68   counter, togeth
0dd0: 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6d  er with the.** m
0de0: 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65  odification time
0df0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 61 6c   of the file, al
0e00: 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65  lows other proce
0e10: 73 73 65 73 20 74 6f 20 6b 6e 6f 77 0a 2a 2a 20  sses to know.** 
0e20: 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 68 61  when the file ha
0e30: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 74 68  s changed and th
0e40: 75 73 20 77 68 65 6e 20 74 68 65 79 20 6e 65 65  us when they nee
0e50: 64 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  d to flush their
0e60: 0a 2a 2a 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  .** cache..**.**
0e70: 20 54 68 65 20 6d 61 78 20 65 6d 62 65 64 64 65   The max embedde
0e80: 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  d payload fracti
0e90: 6f 6e 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  on is the amount
0ea0: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 75 73   of the total us
0eb0: 61 62 6c 65 0a 2a 2a 20 73 70 61 63 65 20 69 6e  able.** space in
0ec0: 20 61 20 70 61 67 65 20 74 68 61 74 20 63 61 6e   a page that can
0ed0: 20 62 65 20 63 6f 6e 73 75 6d 65 64 20 62 79 20   be consumed by 
0ee0: 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c 20 66 6f  a single cell fo
0ef0: 72 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 42 2d  r standard.** B-
0f00: 74 72 65 65 20 28 6e 6f 6e 2d 4c 45 41 46 44 41  tree (non-LEAFDA
0f10: 54 41 29 20 74 61 62 6c 65 73 2e 20 20 41 20 76  TA) tables.  A v
0f20: 61 6c 75 65 20 6f 66 20 32 35 35 20 6d 65 61 6e  alue of 255 mean
0f30: 73 20 31 30 30 25 2e 20 20 54 68 65 20 64 65 66  s 100%.  The def
0f40: 61 75 6c 74 0a 2a 2a 20 69 73 20 74 6f 20 6c 69  ault.** is to li
0f50: 6d 69 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  mit the maximum 
0f60: 63 65 6c 6c 20 73 69 7a 65 20 73 6f 20 74 68 61  cell size so tha
0f70: 74 20 61 74 20 6c 65 61 73 74 20 34 20 63 65 6c  t at least 4 cel
0f80: 6c 73 20 77 69 6c 6c 20 66 69 74 0a 2a 2a 20 6f  ls will fit.** o
0f90: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 54 68 75  n one page.  Thu
0fa0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 61  s the default ma
0fb0: 78 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  x embedded paylo
0fc0: 61 64 20 66 72 61 63 74 69 6f 6e 20 69 73 20 36  ad fraction is 6
0fd0: 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  4..**.** If the 
0fe0: 70 61 79 6c 6f 61 64 20 66 6f 72 20 61 20 63 65  payload for a ce
0ff0: 6c 6c 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ll is larger tha
1000: 6e 20 74 68 65 20 6d 61 78 20 70 61 79 6c 6f 61  n the max payloa
1010: 64 2c 20 74 68 65 6e 20 65 78 74 72 61 0a 2a 2a  d, then extra.**
1020: 20 70 61 79 6c 6f 61 64 20 69 73 20 73 70 69 6c   payload is spil
1030: 6c 65 64 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  led to overflow 
1040: 70 61 67 65 73 2e 20 20 4f 6e 63 65 20 61 6e 20  pages.  Once an 
1050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1060: 20 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 61   allocated,.** a
1070: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 61 73 20  s many bytes as 
1080: 70 6f 73 73 69 62 6c 65 20 61 72 65 20 6d 6f 76  possible are mov
1090: 65 64 20 69 6e 74 6f 20 74 68 65 20 6f 76 65 72  ed into the over
10a0: 66 6c 6f 77 20 70 61 67 65 73 20 77 69 74 68 6f  flow pages witho
10b0: 75 74 20 6c 65 74 74 69 6e 67 0a 2a 2a 20 74 68  ut letting.** th
10c0: 65 20 63 65 6c 6c 20 73 69 7a 65 20 64 72 6f 70  e cell size drop
10d0: 20 62 65 6c 6f 77 20 74 68 65 20 6d 69 6e 20 65   below the min e
10e0: 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20  mbedded payload 
10f0: 66 72 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  fraction..**.** 
1100: 54 68 65 20 6d 69 6e 20 6c 65 61 66 20 70 61 79  The min leaf pay
1110: 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 69 73  load fraction is
1120: 20 6c 69 6b 65 20 74 68 65 20 6d 69 6e 20 65 6d   like the min em
1130: 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 20 66  bedded payload f
1140: 72 61 63 74 69 6f 6e 0a 2a 2a 20 65 78 63 65 70  raction.** excep
1150: 74 20 74 68 61 74 20 69 74 20 61 70 70 6c 69 65  t that it applie
1160: 73 20 74 6f 20 6c 65 61 66 20 6e 6f 64 65 73 20  s to leaf nodes 
1170: 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  in a LEAFDATA tr
1180: 65 65 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d  ee.  The maximum
1190: 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 66 72 61 63  .** payload frac
11a0: 74 69 6f 6e 20 66 6f 72 20 61 20 4c 45 41 46 44  tion for a LEAFD
11b0: 41 54 41 20 74 72 65 65 20 69 73 20 61 6c 77 61  ATA tree is alwa
11c0: 79 73 20 31 30 30 25 20 28 6f 72 20 32 35 35 29  ys 100% (or 255)
11d0: 20 61 6e 64 20 69 74 0a 2a 2a 20 6e 6f 74 20 73   and it.** not s
11e0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
11f0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 61  header..**.** Ea
1200: 63 68 20 62 74 72 65 65 20 70 61 67 65 73 20 69  ch btree pages i
1210: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
1220: 68 72 65 65 20 73 65 63 74 69 6f 6e 73 3a 20 20  hree sections:  
1230: 54 68 65 20 68 65 61 64 65 72 2c 20 74 68 65 0a  The header, the.
1240: 2a 2a 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ** cell pointer 
1250: 61 72 72 61 79 2c 20 61 6e 64 20 74 68 65 20 63  array, and the c
1260: 65 6c 6c 20 61 72 65 61 20 61 72 65 61 2e 20 20  ell area area.  
1270: 50 61 67 65 20 31 20 61 6c 73 6f 20 68 61 73 20  Page 1 also has 
1280: 61 20 31 30 30 2d 62 79 74 65 0a 2a 2a 20 66 69  a 100-byte.** fi
1290: 6c 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  le header that o
12a0: 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65  ccurs before the
12b0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 2a 2a   page header..**
12c0: 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d  .**      |------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20  ----------|.**  
12e0: 20 20 20 20 7c 20 66 69 6c 65 20 68 65 61 64 65      | file heade
12f0: 72 20 20 20 20 7c 20 20 20 31 30 30 20 62 79 74  r    |   100 byt
1300: 65 73 2e 20 20 50 61 67 65 20 31 20 6f 6e 6c 79  es.  Page 1 only
1310: 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d  ..**      |-----
1320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20  -----------|.** 
1330: 20 20 20 20 20 7c 20 70 61 67 65 20 68 65 61 64       | page head
1340: 65 72 20 20 20 20 7c 20 20 20 38 20 62 79 74 65  er    |   8 byte
1350: 73 20 66 6f 72 20 6c 65 61 76 65 73 2e 20 20 31  s for leaves.  1
1360: 32 20 62 79 74 65 73 20 66 6f 72 20 69 6e 74 65  2 bytes for inte
1370: 72 69 6f 72 20 6e 6f 64 65 73 0a 2a 2a 20 20 20  rior nodes.**   
1380: 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     |------------
1390: 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20  ----|.**      | 
13a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 20 20 7c  cell pointer   |
13b0: 20 20 20 7c 20 20 32 20 62 79 74 65 73 20 70 65     |  2 bytes pe
13c0: 72 20 63 65 6c 6c 2e 20 20 53 6f 72 74 65 64 20  r cell.  Sorted 
13d0: 6f 72 64 65 72 2e 0a 2a 2a 20 20 20 20 20 20 7c  order..**      |
13e0: 20 61 72 72 61 79 20 20 20 20 20 20 20 20 20 20   array          
13f0: 7c 20 20 20 7c 20 20 47 72 6f 77 73 20 64 6f 77  |   |  Grows dow
1400: 6e 77 61 72 64 0a 2a 2a 20 20 20 20 20 20 7c 20  nward.**      | 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1420: 20 20 20 76 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d     v.**      |--
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a  --------------|.
1440: 2a 2a 20 20 20 20 20 20 7c 20 75 6e 61 6c 6c 6f  **      | unallo
1450: 63 61 74 65 64 20 20 20 20 7c 0a 2a 2a 20 20 20  cated    |.**   
1460: 20 20 20 7c 20 73 70 61 63 65 20 20 20 20 20 20     | space      
1470: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 7c 2d      |.**      |-
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c  ---------------|
1490: 20 20 20 5e 20 20 47 72 6f 77 73 20 75 70 77 61     ^  Grows upwa
14a0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 7c 20 63 65  rds.**      | ce
14b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 20 20 7c 20 20  ll content   |  
14c0: 20 7c 20 20 41 72 62 69 74 72 61 72 79 20 6f 72   |  Arbitrary or
14d0: 64 65 72 20 69 6e 74 65 72 73 70 65 72 73 65 64  der interspersed
14e0: 20 77 69 74 68 20 66 72 65 65 62 6c 6f 63 6b 73   with freeblocks
14f0: 2e 0a 2a 2a 20 20 20 20 20 20 7c 20 61 72 65 61  ..**      | area
1500: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 7c             |   |
1510: 20 20 61 6e 64 20 66 72 65 65 20 73 70 61 63 65    and free space
1520: 20 66 72 61 67 6d 65 6e 74 73 2e 0a 2a 2a 20 20   fragments..**  
1530: 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      |-----------
1540: 2d 2d 2d 2d 2d 7c 0a 2a 2a 0a 2a 2a 20 54 68 65  -----|.**.** The
1550: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 6c 6f   page headers lo
1560: 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
1570: 2a 0a 2a 2a 20 20 20 4f 46 46 53 45 54 20 20 20  *.**   OFFSET   
1580: 53 49 5a 45 20 20 20 20 20 44 45 53 43 52 49 50  SIZE     DESCRIP
1590: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 30 20 20  TION.**      0  
15a0: 20 20 20 20 20 31 20 20 20 20 20 20 46 6c 61 67       1      Flag
15b0: 73 2e 20 31 3a 20 69 6e 74 6b 65 79 2c 20 32 3a  s. 1: intkey, 2:
15c0: 20 7a 65 72 6f 64 61 74 61 2c 20 34 3a 20 6c 65   zerodata, 4: le
15d0: 61 66 64 61 74 61 2c 20 38 3a 20 6c 65 61 66 0a  afdata, 8: leaf.
15e0: 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
15f0: 32 20 20 20 20 20 20 62 79 74 65 20 6f 66 66 73  2      byte offs
1600: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
1610: 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20  freeblock.**    
1620: 20 20 33 20 20 20 20 20 20 20 32 20 20 20 20 20    3       2     
1630: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
1640: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a   on this page.**
1650: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 32 20        5       2 
1660: 20 20 20 20 20 66 69 72 73 74 20 62 79 74 65 20       first byte 
1670: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
1680: 65 6e 74 20 61 72 65 61 0a 2a 2a 20 20 20 20 20  ent area.**     
1690: 20 37 20 20 20 20 20 20 20 31 20 20 20 20 20 20   7       1      
16a0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65  number of fragme
16b0: 6e 74 65 64 20 66 72 65 65 20 62 79 74 65 73 0a  nted free bytes.
16c0: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
16d0: 34 20 20 20 20 20 20 52 69 67 68 74 20 63 68 69  4      Right chi
16e0: 6c 64 20 28 74 68 65 20 50 74 72 28 4e 29 20 76  ld (the Ptr(N) v
16f0: 61 6c 75 65 29 2e 20 20 4f 6d 69 74 74 65 64 20  alue).  Omitted 
1700: 6f 6e 20 6c 65 61 76 65 73 2e 0a 2a 2a 0a 2a 2a  on leaves..**.**
1710: 20 54 68 65 20 66 6c 61 67 73 20 64 65 66 69 6e   The flags defin
1720: 65 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20  e the format of 
1730: 74 68 69 73 20 62 74 72 65 65 20 70 61 67 65 2e  this btree page.
1740: 20 20 54 68 65 20 6c 65 61 66 20 66 6c 61 67 20    The leaf flag 
1750: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
1760: 69 73 20 70 61 67 65 20 68 61 73 20 6e 6f 20 63  is page has no c
1770: 68 69 6c 64 72 65 6e 2e 20 20 54 68 65 20 7a 65  hildren.  The ze
1780: 72 6f 64 61 74 61 20 66 6c 61 67 20 6d 65 61 6e  rodata flag mean
1790: 73 20 74 68 61 74 20 74 68 69 73 20 70 61 67 65  s that this page
17a0: 20 63 61 72 72 69 65 73 0a 2a 2a 20 6f 6e 6c 79   carries.** only
17b0: 20 6b 65 79 73 20 61 6e 64 20 6e 6f 20 64 61 74   keys and no dat
17c0: 61 2e 20 20 54 68 65 20 69 6e 74 6b 65 79 20 66  a.  The intkey f
17d0: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
17e0: 68 65 20 6b 65 79 20 69 73 20 61 20 69 6e 74 65  he key is a inte
17f0: 67 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  ger.** which is 
1800: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6b 65  stored in the ke
1810: 79 20 73 69 7a 65 20 65 6e 74 72 79 20 6f 66 20  y size entry of 
1820: 74 68 65 20 63 65 6c 6c 20 68 65 61 64 65 72 20  the cell header 
1830: 72 61 74 68 65 72 20 74 68 61 6e 20 69 6e 0a 2a  rather than in.*
1840: 2a 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  * the payload ar
1850: 65 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 65  ea..**.** The ce
1860: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
1870: 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 65 20 66   begins on the f
1880: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
1890: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  the page header.
18a0: 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69  .** The cell poi
18b0: 6e 74 65 72 20 61 72 72 61 79 20 63 6f 6e 74 61  nter array conta
18c0: 69 6e 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ins zero or more
18d0: 20 32 2d 62 79 74 65 20 6e 75 6d 62 65 72 73 20   2-byte numbers 
18e0: 77 68 69 63 68 20 61 72 65 0a 2a 2a 20 6f 66 66  which are.** off
18f0: 73 65 74 73 20 66 72 6f 6d 20 74 68 65 20 62 65  sets from the be
1900: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
1910: 61 67 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  age to the cell 
1920: 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 63  content in the c
1930: 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  ell.** content a
1940: 72 65 61 2e 20 20 54 68 65 20 63 65 6c 6c 20 70  rea.  The cell p
1950: 6f 69 6e 74 65 72 73 20 6f 63 63 75 72 20 69 6e  ointers occur in
1960: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
1970: 54 68 65 20 73 79 73 74 65 6d 20 73 74 72 69 76  The system striv
1980: 65 73 0a 2a 2a 20 74 6f 20 6b 65 65 70 20 66 72  es.** to keep fr
1990: 65 65 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ee space after t
19a0: 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
19b0: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 6e 65 77  nter so that new
19c0: 20 63 65 6c 6c 73 20 63 61 6e 0a 2a 2a 20 62 65   cells can.** be
19d0: 20 65 61 73 69 6c 79 20 61 64 64 65 64 20 77 69   easily added wi
19e0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
19f0: 64 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  defragment the p
1a00: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 43 65 6c 6c 20  age..**.** Cell 
1a10: 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 6f 72 65  content is store
1a20: 64 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  d at the very en
1a30: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
1a40: 64 20 67 72 6f 77 73 20 74 6f 77 61 72 64 20 74  d grows toward t
1a50: 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
1a60: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  of the page..**.
1a70: 2a 2a 20 55 6e 75 73 65 64 20 73 70 61 63 65 20  ** Unused space 
1a80: 77 69 74 68 69 6e 20 74 68 65 20 63 65 6c 6c 20  within the cell 
1a90: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
1aa0: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61  collected into a
1ab0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 0a   linked list of.
1ac0: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  ** freeblocks.  
1ad0: 45 61 63 68 20 66 72 65 65 62 6c 6f 63 6b 20 69  Each freeblock i
1ae0: 73 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  s at least 4 byt
1af0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 65  es in size.  The
1b00: 20 62 79 74 65 20 6f 66 66 73 65 74 0a 2a 2a 20   byte offset.** 
1b10: 74 6f 20 74 68 65 20 66 69 72 73 74 20 66 72 65  to the first fre
1b20: 65 62 6c 6f 63 6b 20 69 73 20 67 69 76 65 6e 20  eblock is given 
1b30: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  in the header.  
1b40: 46 72 65 65 62 6c 6f 63 6b 73 20 6f 63 63 75 72  Freeblocks occur
1b50: 20 69 6e 0a 2a 2a 20 69 6e 63 72 65 61 73 69 6e   in.** increasin
1b60: 67 20 6f 72 64 65 72 2e 20 20 42 65 63 61 75 73  g order.  Becaus
1b70: 65 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 6d 75  e a freeblock mu
1b80: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
1b90: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 0a   bytes in size,.
1ba0: 2a 2a 20 61 6e 79 20 67 72 6f 75 70 20 6f 66 20  ** any group of 
1bb0: 33 20 6f 72 20 66 65 77 65 72 20 75 6e 75 73 65  3 or fewer unuse
1bc0: 64 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  d bytes in the c
1bd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1be0: 20 63 61 6e 6e 6f 74 0a 2a 2a 20 65 78 69 73 74   cannot.** exist
1bf0: 20 6f 6e 20 74 68 65 20 66 72 65 65 62 6c 6f 63   on the freebloc
1c00: 6b 20 63 68 61 69 6e 2e 20 20 41 20 67 72 6f 75  k chain.  A grou
1c10: 70 20 6f 66 20 33 20 6f 72 20 66 65 77 65 72 20  p of 3 or fewer 
1c20: 66 72 65 65 20 62 79 74 65 73 20 69 73 20 63 61  free bytes is ca
1c30: 6c 6c 65 64 0a 2a 2a 20 61 20 66 72 61 67 6d 65  lled.** a fragme
1c40: 6e 74 2e 20 20 54 68 65 20 74 6f 74 61 6c 20 6e  nt.  The total n
1c50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1c60: 6e 20 61 6c 6c 20 66 72 61 67 6d 65 6e 74 73 20  n all fragments 
1c70: 69 73 20 72 65 63 6f 72 64 65 64 2e 0a 2a 2a 20  is recorded..** 
1c80: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
1c90: 65 72 20 61 74 20 6f 66 66 73 65 74 20 37 2e 0a  er at offset 7..
1ca0: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
1cb0: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
1cc0: 20 20 20 20 20 32 20 20 20 20 20 42 79 74 65 20       2     Byte 
1cd0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 6e 65  offset of the ne
1ce0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 20  xt freeblock.** 
1cf0: 20 20 20 20 20 32 20 20 20 20 20 42 79 74 65 73       2     Bytes
1d00: 20 69 6e 20 74 68 69 73 20 66 72 65 65 62 6c 6f   in this freeblo
1d10: 63 6b 0a 2a 2a 0a 2a 2a 20 43 65 6c 6c 73 20 61  ck.**.** Cells a
1d20: 72 65 20 6f 66 20 76 61 72 69 61 62 6c 65 20 6c  re of variable l
1d30: 65 6e 67 74 68 2e 20 20 43 65 6c 6c 73 20 61 72  ength.  Cells ar
1d40: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1d50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
1d60: 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  a at.** the end 
1d70: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 50 6f  of the page.  Po
1d80: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 63 65  inters to the ce
1d90: 6c 6c 73 20 61 72 65 20 69 6e 20 74 68 65 20 63  lls are in the c
1da0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
1db0: 79 0a 2a 2a 20 74 68 61 74 20 69 6d 6d 65 64 69  y.** that immedi
1dc0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1dd0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
1de0: 43 65 6c 6c 73 20 69 73 20 6e 6f 74 20 6e 65 63  Cells is not nec
1df0: 65 73 73 61 72 69 6c 79 0a 2a 2a 20 63 6f 6e 74  essarily.** cont
1e00: 69 67 75 6f 75 73 20 6f 72 20 69 6e 20 6f 72 64  iguous or in ord
1e10: 65 72 2c 20 62 75 74 20 63 65 6c 6c 20 70 6f 69  er, but cell poi
1e20: 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 74 69 67  nters are contig
1e30: 75 6f 75 73 20 61 6e 64 20 69 6e 20 6f 72 64 65  uous and in orde
1e40: 72 2e 0a 2a 2a 0a 2a 2a 20 43 65 6c 6c 20 63 6f  r..**.** Cell co
1e50: 6e 74 65 6e 74 20 6d 61 6b 65 73 20 75 73 65 20  ntent makes use 
1e60: 6f 66 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  of variable leng
1e70: 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20 41 20  th integers.  A 
1e80: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6c 65 6e 67  variable.** leng
1e90: 74 68 20 69 6e 74 65 67 65 72 20 69 73 20 31 20  th integer is 1 
1ea0: 74 6f 20 39 20 62 79 74 65 73 20 77 68 65 72 65  to 9 bytes where
1eb0: 20 74 68 65 20 6c 6f 77 65 72 20 37 20 62 69 74   the lower 7 bit
1ec0: 73 20 6f 66 20 65 61 63 68 20 0a 2a 2a 20 62 79  s of each .** by
1ed0: 74 65 20 61 72 65 20 75 73 65 64 2e 20 20 54 68  te are used.  Th
1ee0: 65 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 69 73  e integer consis
1ef0: 74 73 20 6f 66 20 61 6c 6c 20 62 79 74 65 73 20  ts of all bytes 
1f00: 74 68 61 74 20 68 61 76 65 20 62 69 74 20 38 20  that have bit 8 
1f10: 73 65 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 66  set and.** the f
1f20: 69 72 73 74 20 62 79 74 65 20 77 69 74 68 20 62  irst byte with b
1f30: 69 74 20 38 20 63 6c 65 61 72 2e 20 20 54 68 65  it 8 clear.  The
1f40: 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
1f50: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 69 6e  t byte of the in
1f60: 74 65 67 65 72 0a 2a 2a 20 61 70 70 65 61 72 73  teger.** appears
1f70: 20 66 69 72 73 74 2e 20 20 41 20 76 61 72 69 61   first.  A varia
1f80: 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble-length integ
1f90: 65 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f  er may not be mo
1fa0: 72 65 20 74 68 61 6e 20 39 20 62 79 74 65 73 20  re than 9 bytes 
1fb0: 6c 6f 6e 67 2e 0a 2a 2a 20 41 73 20 61 20 73 70  long..** As a sp
1fc0: 65 63 69 61 6c 20 63 61 73 65 2c 20 61 6c 6c 20  ecial case, all 
1fd0: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 39  8 bytes of the 9
1fe0: 74 68 20 62 79 74 65 20 61 72 65 20 75 73 65 64  th byte are used
1ff0: 20 61 73 20 64 61 74 61 2e 20 20 54 68 69 73 0a   as data.  This.
2000: 2a 2a 20 61 6c 6c 6f 77 73 20 61 20 36 34 2d 62  ** allows a 64-b
2010: 69 74 20 69 6e 74 65 67 65 72 20 74 6f 20 62 65  it integer to be
2020: 20 65 6e 63 6f 64 65 64 20 69 6e 20 39 20 62 79   encoded in 9 by
2030: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 78  tes..**.**    0x
2040: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
2050: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
2060: 20 30 78 30 30 30 30 30 30 30 30 0a 2a 2a 20 20   0x00000000.**  
2070: 20 20 30 78 37 66 20 20 20 20 20 20 20 20 20 20    0x7f          
2080: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2090: 6d 65 73 20 20 30 78 30 30 30 30 30 30 37 66 0a  mes  0x0000007f.
20a0: 2a 2a 20 20 20 20 30 78 38 31 20 30 78 30 30 20  **    0x81 0x00 
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
20d0: 30 38 30 0a 2a 2a 20 20 20 20 30 78 38 32 20 30  080.**    0x82 0
20e0: 78 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  x00             
20f0: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
2100: 30 30 30 30 31 30 30 0a 2a 2a 20 20 20 20 30 78  0000100.**    0x
2110: 38 30 20 30 78 37 66 20 20 20 20 20 20 20 20 20  80 0x7f         
2120: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
2130: 20 30 78 30 30 30 30 30 30 37 66 0a 2a 2a 20 20   0x0000007f.**  
2140: 20 20 30 78 38 61 20 30 78 39 31 20 30 78 64 31    0x8a 0x91 0xd1
2150: 20 30 78 61 63 20 30 78 37 38 20 20 62 65 63 6f   0xac 0x78  beco
2160: 6d 65 73 20 20 30 78 31 32 33 34 35 36 37 38 0a  mes  0x12345678.
2170: 2a 2a 20 20 20 20 30 78 38 31 20 30 78 38 31 20  **    0x81 0x81 
2180: 30 78 38 31 20 30 78 38 31 20 30 78 30 31 20 20  0x81 0x81 0x01  
2190: 62 65 63 6f 6d 65 73 20 20 30 78 31 30 32 30 34  becomes  0x10204
21a0: 30 38 31 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  081.**.** Variab
21b0: 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
21c0: 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
21d0: 72 6f 77 69 64 73 20 61 6e 64 20 74 6f 20 68 6f  rowids and to ho
21e0: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
21f0: 0a 2a 2a 20 62 79 74 65 73 20 6f 66 20 6b 65 79  .** bytes of key
2200: 20 61 6e 64 20 64 61 74 61 20 69 6e 20 61 20 62   and data in a b
2210: 74 72 65 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  tree cell..**.**
2220: 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2230: 61 20 63 65 6c 6c 20 6c 6f 6f 6b 73 20 6c 69 6b  a cell looks lik
2240: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2250: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
2260: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20  TION.**      4  
2270: 20 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f     Page number o
2280: 66 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  f the left child
2290: 2e 20 4f 6d 69 74 74 65 64 20 69 66 20 6c 65 61  . Omitted if lea
22a0: 66 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  f flag is set..*
22b0: 2a 20 20 20 20 20 76 61 72 20 20 20 20 4e 75 6d  *     var    Num
22c0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
22d0: 64 61 74 61 2e 20 4f 6d 69 74 74 65 64 20 69 66  data. Omitted if
22e0: 20 74 68 65 20 7a 65 72 6f 64 61 74 61 20 66 6c   the zerodata fl
22f0: 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20  ag is set..**   
2300: 20 20 76 61 72 20 20 20 20 4e 75 6d 62 65 72 20    var    Number 
2310: 6f 66 20 62 79 74 65 73 20 6f 66 20 6b 65 79 2e  of bytes of key.
2320: 20 4f 72 20 74 68 65 20 6b 65 79 20 69 74 73 65   Or the key itse
2330: 6c 66 20 69 66 20 69 6e 74 6b 65 79 20 66 6c 61  lf if intkey fla
2340: 67 20 69 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20  g is set..**    
2350: 20 20 2a 20 20 20 20 20 50 61 79 6c 6f 61 64 0a    *     Payload.
2360: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 46 69  **      4     Fi
2370: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2380: 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
2390: 20 4f 6d 69 74 74 65 64 20 69 66 20 6e 6f 20 6f   Omitted if no o
23a0: 76 65 72 66 6c 6f 77 0a 2a 2a 0a 2a 2a 20 4f 76  verflow.**.** Ov
23b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 66 6f 72  erflow pages for
23c0: 6d 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  m a linked list.
23d0: 20 20 45 61 63 68 20 70 61 67 65 20 65 78 63 65    Each page exce
23e0: 70 74 20 74 68 65 20 6c 61 73 74 20 69 73 20 63  pt the last is c
23f0: 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 66 69 6c  ompletely.** fil
2400: 6c 65 64 20 77 69 74 68 20 64 61 74 61 20 28 70  led with data (p
2410: 61 67 65 73 69 7a 65 20 2d 20 34 20 62 79 74 65  agesize - 4 byte
2420: 73 29 2e 20 20 54 68 65 20 6c 61 73 74 20 70 61  s).  The last pa
2430: 67 65 20 63 61 6e 20 68 61 76 65 20 61 73 20 6c  ge can have as l
2440: 69 74 74 6c 65 0a 2a 2a 20 61 73 20 31 20 62 79  ittle.** as 1 by
2450: 74 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  te of data..**.*
2460: 2a 20 20 20 20 53 49 5a 45 20 20 20 20 44 45 53  *    SIZE    DES
2470: 43 52 49 50 54 49 4f 4e 0a 2a 2a 20 20 20 20 20  CRIPTION.**     
2480: 20 34 20 20 20 20 20 50 61 67 65 20 6e 75 6d 62   4     Page numb
2490: 65 72 20 6f 66 20 6e 65 78 74 20 6f 76 65 72 66  er of next overf
24a0: 6c 6f 77 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  low page.**     
24b0: 20 2a 20 20 20 20 20 44 61 74 61 0a 2a 2a 0a 2a   *     Data.**.*
24c0: 2a 20 46 72 65 65 6c 69 73 74 20 70 61 67 65 73  * Freelist pages
24d0: 20 63 6f 6d 65 20 69 6e 20 74 77 6f 20 73 75 62   come in two sub
24e0: 74 79 70 65 73 3a 20 74 72 75 6e 6b 20 70 61 67  types: trunk pag
24f0: 65 73 20 61 6e 64 20 6c 65 61 66 20 70 61 67 65  es and leaf page
2500: 73 2e 20 20 54 68 65 0a 2a 2a 20 66 69 6c 65 20  s.  The.** file 
2510: 68 65 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f  header points to
2520: 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
2530: 65 64 20 6c 69 73 74 20 6f 66 20 74 72 75 6e 6b  ed list of trunk
2540: 20 70 61 67 65 2e 20 20 45 61 63 68 20 74 72 75   page.  Each tru
2550: 6e 6b 0a 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  nk.** page point
2560: 73 20 74 6f 20 6d 75 6c 74 69 70 6c 65 20 6c 65  s to multiple le
2570: 61 66 20 70 61 67 65 73 2e 20 20 54 68 65 20 63  af pages.  The c
2580: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 6c 65 61 66  ontent of a leaf
2590: 20 70 61 67 65 20 69 73 0a 2a 2a 20 75 6e 73 70   page is.** unsp
25a0: 65 63 69 66 69 65 64 2e 20 20 41 20 74 72 75 6e  ecified.  A trun
25b0: 6b 20 70 61 67 65 20 6c 6f 6f 6b 73 20 6c 69 6b  k page looks lik
25c0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
25d0: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
25e0: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 34 20 20  TION.**      4  
25f0: 20 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f     Page number o
2600: 66 20 6e 65 78 74 20 74 72 75 6e 6b 20 70 61 67  f next trunk pag
2610: 65 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  e.**      4     
2620: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
2630: 6f 69 6e 74 65 72 73 20 6f 6e 20 74 68 69 73 20  ointers on this 
2640: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 2a 20 20  page.**      *  
2650: 20 20 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20     zero or more 
2660: 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 6f 66  pages numbers of
2670: 20 6c 65 61 76 65 73 0a 2a 2f 0a 23 69 6e 63 6c   leaves.*/.#incl
2680: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
2690: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
26a0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 62  r.h".#include "b
26b0: 74 72 65 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65  tree.h".#include
26c0: 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65   "os.h".#include
26d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 20   <assert.h>../* 
26e0: 52 6f 75 6e 64 20 75 70 20 61 20 6e 75 6d 62 65  Round up a numbe
26f0: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 61  r to the next la
2700: 72 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  rger multiple of
2710: 20 38 2e 20 20 54 68 69 73 20 69 73 20 75 73 65   8.  This is use
2720: 64 0a 2a 2a 20 74 6f 20 66 6f 72 63 65 20 38 2d  d.** to force 8-
2730: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
2740: 6e 20 36 34 2d 62 69 74 20 61 72 63 68 69 74 65  n 64-bit archite
2750: 63 74 75 72 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  ctures..*/.#defi
2760: 6e 65 20 52 4f 55 4e 44 38 28 78 29 20 20 20 28  ne ROUND8(x)   (
2770: 28 78 2b 37 29 26 7e 37 29 0a 0a 0a 2f 2a 20 54  (x+7)&~7).../* T
2780: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
2790: 75 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ue is the maximu
27a0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 61 73 73 75  m cell size assu
27b0: 6d 69 6e 67 20 61 20 6d 61 78 69 6d 75 6d 20 70  ming a maximum p
27c0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 67 69 76 65  age.** size give
27d0: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 23 64 65 66 69   above..*/.#defi
27e0: 6e 65 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ne MX_CELL_SIZE(
27f0: 70 42 74 29 20 20 28 70 42 74 2d 3e 70 61 67 65  pBt)  (pBt->page
2800: 53 69 7a 65 2d 38 29 0a 0a 2f 2a 20 54 68 65 20  Size-8)../* The 
2810: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2820: 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 73 69 6e  f cells on a sin
2830: 67 6c 65 20 70 61 67 65 20 6f 66 20 74 68 65 20  gle page of the 
2840: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a  database.  This.
2850: 2a 2a 20 61 73 73 75 6d 65 73 20 61 20 6d 69 6e  ** assumes a min
2860: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 6f  imum cell size o
2870: 66 20 33 20 62 79 74 65 73 2e 20 20 53 75 63 68  f 3 bytes.  Such
2880: 20 73 6d 61 6c 6c 20 63 65 6c 6c 73 20 77 69 6c   small cells wil
2890: 6c 20 62 65 0a 2a 2a 20 65 78 63 65 65 64 69 6e  l be.** exceedin
28a0: 67 6c 79 20 72 61 72 65 2c 20 62 75 74 20 74 68  gly rare, but th
28b0: 65 79 20 61 72 65 20 70 6f 73 73 69 62 6c 65 2e  ey are possible.
28c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
28d0: 45 4c 4c 28 70 42 74 29 20 28 28 70 42 74 2d 3e  ELL(pBt) ((pBt->
28e0: 70 61 67 65 53 69 7a 65 2d 38 29 2f 33 29 0a 0a  pageSize-8)/3)..
28f0: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
2900: 72 61 74 69 6f 6e 73 20 2a 2f 0a 74 79 70 65 64  rations */.typed
2910: 65 66 20 73 74 72 75 63 74 20 4d 65 6d 50 61 67  ef struct MemPag
2920: 65 20 4d 65 6d 50 61 67 65 3b 0a 74 79 70 65 64  e MemPage;.typed
2930: 65 66 20 73 74 72 75 63 74 20 42 74 4c 6f 63 6b  ef struct BtLock
2940: 20 42 74 4c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a 20   BtLock;../*.** 
2950: 54 68 69 73 20 69 73 20 61 20 6d 61 67 69 63 20  This is a magic 
2960: 73 74 72 69 6e 67 20 74 68 61 74 20 61 70 70 65  string that appe
2970: 61 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  ars at the begin
2980: 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a 2a 2a  ning of every.**
2990: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
29a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 64 65   in order to ide
29b0: 6e 74 69 66 79 20 74 68 65 20 66 69 6c 65 20 61  ntify the file a
29c0: 73 20 61 20 72 65 61 6c 20 64 61 74 61 62 61 73  s a real databas
29d0: 65 2e 0a 2a 2a 0a 2a 2a 20 59 6f 75 20 63 61 6e  e..**.** You can
29e0: 20 63 68 61 6e 67 65 20 74 68 69 73 20 76 61 6c   change this val
29f0: 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ue at compile-ti
2a00: 6d 65 20 62 79 20 73 70 65 63 69 66 79 69 6e 67  me by specifying
2a10: 20 61 0a 2a 2a 20 2d 44 53 51 4c 49 54 45 5f 46   a.** -DSQLITE_F
2a20: 49 4c 45 5f 48 45 41 44 45 52 3d 22 2e 2e 2e 22  ILE_HEADER="..."
2a30: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2a40: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 20 20   command-line.  
2a50: 54 68 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75  The.** header mu
2a60: 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 31 36  st be exactly 16
2a70: 20 62 79 74 65 73 20 69 6e 63 6c 75 64 69 6e 67   bytes including
2a80: 20 74 68 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e   the zero-termin
2a90: 61 74 6f 72 20 73 6f 0a 2a 2a 20 74 68 65 20 73  ator so.** the s
2aa0: 74 72 69 6e 67 20 69 74 73 65 6c 66 20 73 68 6f  tring itself sho
2ab0: 75 6c 64 20 62 65 20 31 35 20 63 68 61 72 61 63  uld be 15 charac
2ac0: 74 65 72 73 20 6c 6f 6e 67 2e 20 20 49 66 20 79  ters long.  If y
2ad0: 6f 75 20 63 68 61 6e 67 65 0a 2a 2a 20 74 68 65  ou change.** the
2ae0: 20 68 65 61 64 65 72 2c 20 74 68 65 6e 20 79 6f   header, then yo
2af0: 75 72 20 63 75 73 74 6f 6d 20 6c 69 62 72 61 72  ur custom librar
2b00: 79 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  y will not be ab
2b10: 6c 65 20 74 6f 20 72 65 61 64 20 0a 2a 2a 20 64  le to read .** d
2b20: 61 74 61 62 61 73 65 73 20 67 65 6e 65 72 61 74  atabases generat
2b30: 65 64 20 62 79 20 74 68 65 20 73 74 61 6e 64 61  ed by the standa
2b40: 72 64 20 74 6f 6f 6c 73 20 61 6e 64 20 74 68 65  rd tools and the
2b50: 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c 73 0a   standard tools.
2b60: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
2b70: 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74 61  ble to read data
2b80: 62 61 73 65 73 20 63 72 65 61 74 65 64 20 62 79  bases created by
2b90: 20 79 6f 75 72 20 63 75 73 74 6f 6d 20 6c 69 62   your custom lib
2ba0: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  rary..*/.#ifndef
2bb0: 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41   SQLITE_FILE_HEA
2bc0: 44 45 52 20 2f 2a 20 31 32 33 34 35 36 37 38 39  DER /* 123456789
2bd0: 20 31 32 33 34 35 36 20 2a 2f 0a 23 20 20 64 65   123456 */.#  de
2be0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 49 4c 45  fine SQLITE_FILE
2bf0: 5f 48 45 41 44 45 52 20 22 53 51 4c 69 74 65 20  _HEADER "SQLite 
2c00: 66 6f 72 6d 61 74 20 33 22 0a 23 65 6e 64 69 66  format 3".#endif
2c10: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2c20: 61 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b  ar zMagicHeader[
2c30: 5d 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f  ] = SQLITE_FILE_
2c40: 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 50  HEADER;../*.** P
2c50: 61 67 65 20 74 79 70 65 20 66 6c 61 67 73 2e 20  age type flags. 
2c60: 20 41 6e 20 4f 52 65 64 20 63 6f 6d 62 69 6e 61   An ORed combina
2c70: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 66 6c  tion of these fl
2c80: 61 67 73 20 61 70 70 65 61 72 20 61 73 20 74 68  ags appear as th
2c90: 65 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20  e.** first byte 
2ca0: 6f 66 20 65 76 65 72 79 20 42 54 72 65 65 20 70  of every BTree p
2cb0: 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  age..*/.#define 
2cc0: 50 54 46 5f 49 4e 54 4b 45 59 20 20 20 20 30 78  PTF_INTKEY    0x
2cd0: 30 31 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 5a  01.#define PTF_Z
2ce0: 45 52 4f 44 41 54 41 20 20 30 78 30 32 0a 23 64  ERODATA  0x02.#d
2cf0: 65 66 69 6e 65 20 50 54 46 5f 4c 45 41 46 44 41  efine PTF_LEAFDA
2d00: 54 41 20 20 30 78 30 34 0a 23 64 65 66 69 6e 65  TA  0x04.#define
2d10: 20 50 54 46 5f 4c 45 41 46 20 20 20 20 20 20 30   PTF_LEAF      0
2d20: 78 30 38 0a 0a 2f 2a 0a 2a 2a 20 41 73 20 65 61  x08../*.** As ea
2d30: 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  ch page of the f
2d40: 69 6c 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  ile is loaded in
2d50: 74 6f 20 6d 65 6d 6f 72 79 2c 20 61 6e 20 69 6e  to memory, an in
2d60: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2d70: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
2d80: 74 75 72 65 20 69 73 20 61 70 70 65 6e 64 65 64  ture is appended
2d90: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
2da0: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 69 73 20   to zero.  This 
2db0: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
2dc0: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2dd0: 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 74  about the page t
2de0: 68 61 74 20 69 73 20 64 65 63 6f 64 65 64 20 66  hat is decoded f
2df0: 72 6f 6d 20 74 68 65 20 72 61 77 20 66 69 6c 65  rom the raw file
2e00: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
2e10: 20 70 50 61 72 65 6e 74 20 66 69 65 6c 64 20 70   pParent field p
2e20: 6f 69 6e 74 73 20 62 61 63 6b 20 74 6f 20 74 68  oints back to th
2e30: 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20  e parent page.  
2e40: 54 68 69 73 20 61 6c 6c 6f 77 73 20 75 73 20 74  This allows us t
2e50: 6f 0a 2a 2a 20 77 61 6c 6b 20 75 70 20 74 68 65  o.** walk up the
2e60: 20 42 54 72 65 65 20 66 72 6f 6d 20 61 6e 79 20   BTree from any 
2e70: 6c 65 61 66 20 74 6f 20 74 68 65 20 72 6f 6f 74  leaf to the root
2e80: 2e 20 20 43 61 72 65 20 6d 75 73 74 20 62 65 20  .  Care must be 
2e90: 74 61 6b 65 6e 20 74 6f 0a 2a 2a 20 75 6e 72 65  taken to.** unre
2ea0: 66 28 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  f() the parent p
2eb0: 61 67 65 20 70 6f 69 6e 74 65 72 20 77 68 65 6e  age pointer when
2ec0: 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f   this page is no
2ed0: 20 6c 6f 6e 67 65 72 20 72 65 66 65 72 65 6e 63   longer referenc
2ee0: 65 64 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 44  ed..** The pageD
2ef0: 65 73 74 72 75 63 74 6f 72 28 29 20 72 6f 75 74  estructor() rout
2f00: 69 6e 65 20 68 61 6e 64 6c 65 73 20 74 68 61 74  ine handles that
2f10: 20 63 68 6f 72 65 2e 0a 2a 2f 0a 73 74 72 75 63   chore..*/.struc
2f20: 74 20 4d 65 6d 50 61 67 65 20 7b 0a 20 20 75 38  t MemPage {.  u8
2f30: 20 69 73 49 6e 69 74 3b 20 20 20 20 20 20 20 20   isInit;        
2f40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72     /* True if pr
2f50: 65 76 69 6f 75 73 6c 79 20 69 6e 69 74 69 61 6c  eviously initial
2f60: 69 7a 65 64 2e 20 4d 55 53 54 20 42 45 20 46 49  ized. MUST BE FI
2f70: 52 53 54 21 20 2a 2f 0a 20 20 75 38 20 69 64 78  RST! */.  u8 idx
2f80: 53 68 69 66 74 3b 20 20 20 20 20 20 20 20 20 2f  Shift;         /
2f90: 2a 20 54 72 75 65 20 69 66 20 43 65 6c 6c 20 69  * True if Cell i
2fa0: 6e 64 69 63 65 73 20 68 61 76 65 20 63 68 61 6e  ndices have chan
2fb0: 67 65 64 20 2a 2f 0a 20 20 75 38 20 6e 4f 76 65  ged */.  u8 nOve
2fc0: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 2f 2a  rflow;        /*
2fd0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72 66   Number of overf
2fe0: 6c 6f 77 20 63 65 6c 6c 20 62 6f 64 69 65 73 20  low cell bodies 
2ff0: 69 6e 20 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  in aCell[] */.  
3000: 75 38 20 69 6e 74 4b 65 79 3b 20 20 20 20 20 20  u8 intKey;      
3010: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3020: 69 6e 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73  intkey flag is s
3030: 65 74 20 2a 2f 0a 20 20 75 38 20 6c 65 61 66 3b  et */.  u8 leaf;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 72 75 65 20 69 66 20 6c 65 61 66 20 66 6c 61  True if leaf fla
3060: 67 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 75 38  g is set */.  u8
3070: 20 7a 65 72 6f 44 61 74 61 3b 20 20 20 20 20 20   zeroData;      
3080: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 61     /* True if ta
3090: 62 6c 65 20 73 74 6f 72 65 73 20 6b 65 79 73 20  ble stores keys 
30a0: 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 6c 65 61  only */.  u8 lea
30b0: 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  fData;         /
30c0: 2a 20 54 72 75 65 20 69 66 20 74 61 62 6c 65 73  * True if tables
30d0: 20 73 74 6f 72 65 73 20 64 61 74 61 20 6f 6e 20   stores data on 
30e0: 6c 65 61 76 65 73 20 6f 6e 6c 79 20 2a 2f 0a 20  leaves only */. 
30f0: 20 75 38 20 68 61 73 44 61 74 61 3b 20 20 20 20   u8 hasData;    
3100: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3110: 20 74 68 69 73 20 70 61 67 65 20 73 74 6f 72 65   this page store
3120: 73 20 64 61 74 61 20 2a 2f 0a 20 20 75 38 20 68  s data */.  u8 h
3130: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
3140: 20 2f 2a 20 31 30 30 20 66 6f 72 20 70 61 67 65   /* 100 for page
3150: 20 31 2e 20 20 30 20 6f 74 68 65 72 77 69 73 65   1.  0 otherwise
3160: 20 2a 2f 0a 20 20 75 38 20 63 68 69 6c 64 50 74   */.  u8 childPt
3170: 72 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 30 20  rSize;     /* 0 
3180: 69 66 20 6c 65 61 66 3d 3d 31 2e 20 20 34 20 69  if leaf==1.  4 i
3190: 66 20 6c 65 61 66 3d 3d 30 20 2a 2f 0a 20 20 75  f leaf==0 */.  u
31a0: 31 36 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 20 20  16 maxLocal;    
31b0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42      /* Copy of B
31c0: 74 72 65 65 2e 6d 61 78 4c 6f 63 61 6c 20 6f 72  tree.maxLocal or
31d0: 20 42 74 72 65 65 2e 6d 61 78 4c 65 61 66 20 2a   Btree.maxLeaf *
31e0: 2f 0a 20 20 75 31 36 20 6d 69 6e 4c 6f 63 61 6c  /.  u16 minLocal
31f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  ;        /* Copy
3200: 20 6f 66 20 42 74 72 65 65 2e 6d 69 6e 4c 6f 63   of Btree.minLoc
3210: 61 6c 20 6f 72 20 42 74 72 65 65 2e 6d 69 6e 4c  al or Btree.minL
3220: 65 61 66 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c  eaf */.  u16 cel
3230: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  lOffset;      /*
3240: 20 49 6e 64 65 78 20 69 6e 20 61 44 61 74 61 20   Index in aData 
3250: 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
3260: 69 6e 74 65 72 20 2a 2f 0a 20 20 75 31 36 20 69  inter */.  u16 i
3270: 64 78 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  dxParent;       
3280: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 61 72 65  /* Index in pare
3290: 6e 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20  nt of this node 
32a0: 2a 2f 0a 20 20 75 31 36 20 6e 46 72 65 65 3b 20  */.  u16 nFree; 
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32c0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
32d0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
32e0: 0a 20 20 75 31 36 20 6e 43 65 6c 6c 3b 20 20 20  .  u16 nCell;   
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3300: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
3310: 69 73 20 70 61 67 65 2c 20 6c 6f 63 61 6c 20 61  is page, local a
3320: 6e 64 20 6f 76 66 6c 20 2a 2f 0a 20 20 73 74 72  nd ovfl */.  str
3330: 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 7b 20  uct _OvflCell { 
3340: 20 20 2f 2a 20 43 65 6c 6c 73 20 74 68 61 74 20    /* Cells that 
3350: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
3360: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
3370: 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
3380: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
3390: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
33a0: 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
33b0: 2a 2f 0a 20 20 20 20 75 31 36 20 69 64 78 3b 20  */.    u16 idx; 
33c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33d0: 73 65 72 74 20 74 68 69 73 20 63 65 6c 6c 20 62  sert this cell b
33e0: 65 66 6f 72 65 20 69 64 78 2d 74 68 20 6e 6f 6e  efore idx-th non
33f0: 2d 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 2a  -overflow cell *
3400: 2f 0a 20 20 7d 20 61 4f 76 66 6c 5b 35 5d 3b 0a  /.  } aOvfl[5];.
3410: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
3420: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3430: 72 20 62 61 63 6b 20 74 6f 20 42 54 72 65 65 20  r back to BTree 
3440: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
3450: 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
3460: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 62      /* Pointer b
3470: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 72 74  ack to the start
3480: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
3490: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
34a0: 65 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  e;     /* Pager 
34b0: 70 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  page handle */. 
34c0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
34d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
34e0: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
34f0: 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
3500: 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
3510: 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  The parent of th
3520: 69 73 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  is page.  NULL f
3530: 6f 72 20 72 6f 6f 74 20 2a 2f 0a 7d 3b 0a 0a 2f  or root */.};../
3540: 2a 0a 2a 2a 20 54 68 65 20 69 6e 2d 6d 65 6d 6f  *.** The in-memo
3550: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 64 69  ry image of a di
3560: 73 6b 20 70 61 67 65 20 68 61 73 20 74 68 65 20  sk page has the 
3570: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
3580: 61 74 69 6f 6e 20 61 70 70 65 6e 64 65 64 0a 2a  ation appended.*
3590: 2a 20 74 6f 20 74 68 65 20 65 6e 64 2e 20 20 45  * to the end.  E
35a0: 58 54 52 41 5f 53 49 5a 45 20 69 73 20 74 68 65  XTRA_SIZE is the
35b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
35c0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
35d0: 20 74 6f 20 68 6f 6c 64 0a 2a 2a 20 74 68 61 74   to hold.** that
35e0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
35f0: 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 45  on..*/.#define E
3600: 58 54 52 41 5f 53 49 5a 45 20 73 69 7a 65 6f 66  XTRA_SIZE sizeof
3610: 28 4d 65 6d 50 61 67 65 29 0a 0a 2f 2a 20 42 74  (MemPage)../* Bt
3620: 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 73 74  ree handle */.st
3630: 72 75 63 74 20 42 74 72 65 65 20 7b 0a 20 20 73  ruct Btree {.  s
3640: 71 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65 3b  qlite3 *pSqlite;
3650: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3660: 3b 0a 20 20 75 38 20 69 6e 54 72 61 6e 73 3b 20  ;.  u8 inTrans; 
3670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
3680: 41 4e 53 5f 4e 4f 4e 45 2c 20 54 52 41 4e 53 5f  ANS_NONE, TRANS_
3690: 52 45 41 44 20 6f 72 20 54 52 41 4e 53 5f 57 52  READ or TRANS_WR
36a0: 49 54 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ITE */.};../*.**
36b0: 20 42 74 72 65 65 2e 69 6e 54 72 61 6e 73 20 6d   Btree.inTrans m
36c0: 61 79 20 74 61 6b 65 20 6f 6e 65 20 6f 66 20 74  ay take one of t
36d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  he following val
36e0: 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ues..**.** If th
36f0: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 65 78  e shared-data ex
3700: 74 65 6e 73 69 6f 6e 20 69 73 20 65 6e 61 62 6c  tension is enabl
3710: 65 64 2c 20 74 68 65 72 65 20 6d 61 79 20 62 65  ed, there may be
3720: 20 6d 75 6c 74 69 70 6c 65 20 75 73 65 72 73 0a   multiple users.
3730: 2a 2a 20 6f 66 20 74 68 65 20 42 74 72 65 65 20  ** of the Btree 
3740: 73 74 72 75 63 74 75 72 65 2e 20 41 74 20 6d 6f  structure. At mo
3750: 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20  st one of these 
3760: 6d 61 79 20 6f 70 65 6e 20 61 20 77 72 69 74 65  may open a write
3770: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
3780: 20 62 75 74 20 61 6e 79 20 6e 75 6d 62 65 72 20   but any number 
3790: 6d 61 79 20 68 61 76 65 20 61 63 74 69 76 65 20  may have active 
37a0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
37b0: 73 2e 20 56 61 72 69 61 62 6c 65 20 42 74 72 65  s. Variable Btre
37c0: 65 2e 70 44 62 20 0a 2a 2a 20 70 6f 69 6e 74 73  e.pDb .** points
37d0: 20 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 74   to the handle t
37e0: 68 61 74 20 6f 77 6e 73 20 61 6e 79 20 63 75 72  hat owns any cur
37f0: 72 65 6e 74 20 77 72 69 74 65 2d 74 72 61 6e 73  rent write-trans
3800: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69  action..*/.#defi
3810: 6e 65 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 20 30  ne TRANS_NONE  0
3820: 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 52  .#define TRANS_R
3830: 45 41 44 20 20 31 0a 23 64 65 66 69 6e 65 20 54  EAD  1.#define T
3840: 52 41 4e 53 5f 57 52 49 54 45 20 32 0a 0a 2f 2a  RANS_WRITE 2../*
3850: 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 77  .** Everything w
3860: 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 61  e need to know a
3870: 62 6f 75 74 20 61 6e 20 6f 70 65 6e 20 64 61 74  bout an open dat
3880: 61 62 61 73 65 0a 2a 2f 0a 73 74 72 75 63 74 20  abase.*/.struct 
3890: 42 74 53 68 61 72 65 64 20 7b 0a 20 20 50 61 67  BtShared {.  Pag
38a0: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
38b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 63     /* The page c
38c0: 61 63 68 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ache */.  BtCurs
38d0: 6f 72 20 2a 70 43 75 72 73 6f 72 3b 20 20 20 20  or *pCursor;    
38e0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
38f0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 2a 2f   open cursors */
3900: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3910: 65 31 3b 20 20 20 20 20 20 2f 2a 20 46 69 72 73  e1;      /* Firs
3920: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
3930: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 69  tabase */.  u8 i
3940: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
3950: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
3960: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
3970: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
3980: 6e 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  n */.  u8 readOn
3990: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ly;          /* 
39a0: 54 72 75 65 20 69 66 20 74 68 65 20 75 6e 64 65  True if the unde
39b0: 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 73 20 72  rlying file is r
39c0: 65 61 64 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20  eadonly */.  u8 
39d0: 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 20 20 20  maxEmbedFrac;   
39e0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61     /* Maximum pa
39f0: 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f  yload as % of to
3a00: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
3a10: 0a 20 20 75 38 20 6d 69 6e 45 6d 62 65 64 46 72  .  u8 minEmbedFr
3a20: 61 63 3b 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ac;      /* Mini
3a30: 6d 75 6d 20 70 61 79 6c 6f 61 64 20 61 73 20 25  mum payload as %
3a40: 20 6f 66 20 74 6f 74 61 6c 20 70 61 67 65 20 73   of total page s
3a50: 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4c  ize */.  u8 minL
3a60: 65 61 66 46 72 61 63 3b 20 20 20 20 20 20 20 2f  eafFrac;       /
3a70: 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 61 66 20 70  * Minimum leaf p
3a80: 61 79 6c 6f 61 64 20 61 73 20 25 20 6f 66 20 74  ayload as % of t
3a90: 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a  otal page size *
3aa0: 2f 0a 20 20 75 38 20 70 61 67 65 53 69 7a 65 46  /.  u8 pageSizeF
3ab0: 69 78 65 64 3b 20 20 20 20 20 2f 2a 20 54 72 75  ixed;     /* Tru
3ac0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  e if the page si
3ad0: 7a 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ze can no longer
3ae0: 20 62 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 23   be changed */.#
3af0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3b00: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
3b10: 75 38 20 61 75 74 6f 56 61 63 75 75 6d 3b 20 20  u8 autoVacuum;  
3b20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3b30: 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
3b40: 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 2a  ts auto-vacuum *
3b50: 2f 0a 23 65 6e 64 69 66 0a 20 20 75 31 36 20 70  /.#endif.  u16 p
3b60: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
3b70: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
3b80: 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 61 20 70   of bytes on a p
3b90: 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 75 73 61  age */.  u16 usa
3ba0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  bleSize;       /
3bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
3bc0: 6c 65 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68  le bytes on each
3bd0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d   page */.  int m
3be0: 61 78 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20  axLocal;        
3bf0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61   /* Maximum loca
3c00: 6c 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e  l payload in non
3c10: 2d 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73  -LEAFDATA tables
3c20: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63   */.  int minLoc
3c30: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  al;         /* M
3c40: 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79  inimum local pay
3c50: 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46  load in non-LEAF
3c60: 44 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20  DATA tables */. 
3c70: 20 69 6e 74 20 6d 61 78 4c 65 61 66 3b 20 20 20   int maxLeaf;   
3c80: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3c90: 6d 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20  m local payload 
3ca0: 69 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 61  in a LEAFDATA ta
3cb0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e  ble */.  int min
3cc0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 2f  Leaf;          /
3cd0: 2a 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20  * Minimum local 
3ce0: 70 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41  payload in a LEA
3cf0: 46 44 41 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20  FDATA table */. 
3d00: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
3d10: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 20 2f 2a  usyHandler;   /*
3d20: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 77 68   Callback for wh
3d30: 65 6e 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b  en there is lock
3d40: 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 2a 2f 0a 20   contention */. 
3d50: 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
3d60: 6e 3b 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 61  n;     /* Transa
3d70: 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 20  ction state */. 
3d80: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
3d90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3da0: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
3db0: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
3dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   */.  int nTrans
3dd0: 61 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 4e  action;     /* N
3de0: 75 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 74 72  umber of open tr
3df0: 61 6e 73 61 63 74 69 6f 6e 73 20 28 72 65 61 64  ansactions (read
3e00: 20 2b 20 77 72 69 74 65 29 20 2a 2f 0a 20 20 76   + write) */.  v
3e10: 6f 69 64 20 2a 70 53 63 68 65 6d 61 3b 20 20 20  oid *pSchema;   
3e20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3e30: 74 6f 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  to space allocat
3e40: 65 64 20 62 79 20 73 71 6c 69 74 65 33 42 74 72  ed by sqlite3Btr
3e50: 65 65 53 63 68 65 6d 61 28 29 20 2a 2f 0a 20 20  eeSchema() */.  
3e60: 76 6f 69 64 20 28 2a 78 46 72 65 65 53 63 68 65  void (*xFreeSche
3e70: 6d 61 29 28 76 6f 69 64 2a 29 3b 20 20 2f 2a 20  ma)(void*);  /* 
3e80: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 42  Destructor for B
3e90: 74 53 68 61 72 65 64 2e 70 53 63 68 65 6d 61 20  tShared.pSchema 
3ea0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3eb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3ec0: 43 48 45 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  CHE.  BtLock *pL
3ed0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  ock;        /* L
3ee0: 69 73 74 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ist of locks hel
3ef0: 64 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  d on this shared
3f00: 2d 62 74 72 65 65 20 73 74 72 75 63 74 20 2a 2f  -btree struct */
3f10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4e 65  .  BtShared *pNe
3f20: 78 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  xt;      /* Next
3f30: 20 69 6e 20 54 68 72 65 61 64 44 61 74 61 2e 70   in ThreadData.p
3f40: 42 74 72 65 65 20 6c 69 6e 6b 65 64 20 6c 69 73  Btree linked lis
3f50: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  t */.#endif.};..
3f60: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3f70: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3f80: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
3f90: 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 69 6e 66  used to hold inf
3fa0: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75  ormation.** abou
3fb0: 74 20 61 20 63 65 6c 6c 2e 20 20 54 68 65 20 70  t a cell.  The p
3fc0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 66 75  arseCellPtr() fu
3fd0: 6e 63 74 69 6f 6e 20 66 69 6c 6c 73 20 69 6e 20  nction fills in 
3fe0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 2a  this structure.*
3ff0: 2a 20 62 61 73 65 64 20 6f 6e 20 69 6e 66 6f 72  * based on infor
4000: 6d 61 74 69 6f 6e 20 65 78 74 72 61 63 74 20 66  mation extract f
4010: 72 6f 6d 20 74 68 65 20 72 61 77 20 64 69 73 6b  rom the raw disk
4020: 20 70 61 67 65 2e 0a 2a 2f 0a 74 79 70 65 64 65   page..*/.typede
4030: 66 20 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66  f struct CellInf
4040: 6f 20 43 65 6c 6c 49 6e 66 6f 3b 0a 73 74 72 75  o CellInfo;.stru
4050: 63 74 20 43 65 6c 6c 49 6e 66 6f 20 7b 0a 20 20  ct CellInfo {.  
4060: 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 2f  u8 *pCell;     /
4070: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
4080: 20 73 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63   start of cell c
4090: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  ontent */.  i64 
40a0: 6e 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54 68  nKey;      /* Th
40b0: 65 20 6b 65 79 20 66 6f 72 20 49 4e 54 4b 45 59  e key for INTKEY
40c0: 20 74 61 62 6c 65 73 2c 20 6f 72 20 6e 75 6d 62   tables, or numb
40d0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6b  er of bytes in k
40e0: 65 79 20 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74  ey */.  u32 nDat
40f0: 61 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  a;     /* Number
4100: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
4110: 61 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  a */.  u32 nPayl
4120: 6f 61 64 3b 20 20 2f 2a 20 54 6f 74 61 6c 20 61  oad;  /* Total a
4130: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
4140: 20 2a 2f 0a 20 20 75 31 36 20 6e 48 65 61 64 65   */.  u16 nHeade
4150: 72 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  r;   /* Size of 
4160: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
4170: 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
4180: 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 63 61 6c   */.  u16 nLocal
4190: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
41a0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
41b0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 75 31 36 20  ocally */.  u16 
41c0: 69 4f 76 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66  iOverflow; /* Of
41d0: 66 73 65 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  fset to overflow
41e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a   page number.  Z
41f0: 65 72 6f 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c  ero if no overfl
4200: 6f 77 20 2a 2f 0a 20 20 75 31 36 20 6e 53 69 7a  ow */.  u16 nSiz
4210: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
4220: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
4230: 6e 74 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  nt on the main b
4240: 2d 74 72 65 65 20 70 61 67 65 20 2a 2f 0a 7d 3b  -tree page */.};
4250: 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ../*.** A cursor
4260: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4270: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 65 6e   a particular en
4280: 74 72 79 20 69 6e 20 74 68 65 20 42 54 72 65 65  try in the BTree
4290: 2e 0a 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 69  ..** The entry i
42a0: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
42b0: 69 74 73 20 4d 65 6d 50 61 67 65 20 61 6e 64 20  its MemPage and 
42c0: 74 68 65 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20  the index in.** 
42d0: 4d 65 6d 50 61 67 65 2e 61 43 65 6c 6c 5b 5d 20  MemPage.aCell[] 
42e0: 6f 66 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2f  of the entry..*/
42f0: 0a 73 74 72 75 63 74 20 42 74 43 75 72 73 6f 72  .struct BtCursor
4300: 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72   {.  Btree *pBtr
4310: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ee;            /
4320: 2a 20 54 68 65 20 42 74 72 65 65 20 74 6f 20 77  * The Btree to w
4330: 68 69 63 68 20 74 68 69 73 20 63 75 72 73 6f 72  hich this cursor
4340: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 42 74   belongs */.  Bt
4350: 43 75 72 73 6f 72 20 2a 70 4e 65 78 74 2c 20 2a  Cursor *pNext, *
4360: 70 50 72 65 76 3b 20 20 2f 2a 20 46 6f 72 6d 73  pPrev;  /* Forms
4370: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
4380: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  f all cursors */
4390: 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72  .  int (*xCompar
43a0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
43b0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
43c0: 73 74 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 4b 65  st void*); /* Ke
43d0: 79 20 63 6f 6d 70 20 66 75 6e 63 20 2a 2f 0a 20  y comp func */. 
43e0: 20 76 6f 69 64 20 2a 70 41 72 67 3b 20 20 20 20   void *pArg;    
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4400: 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
4410: 61 72 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  are() */.  Pgno 
4420: 70 67 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20  pgnoRoot;       
4430: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74       /* The root
4440: 20 70 61 67 65 20 6f 66 20 74 68 69 73 20 74 72   page of this tr
4450: 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
4460: 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
4470: 20 20 2f 2a 20 50 61 67 65 20 74 68 61 74 20 63    /* Page that c
4480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
4490: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  y */.  int idx; 
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
44c0: 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
44d0: 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 43 65  >aCell[] */.  Ce
44e0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20  llInfo info;    
44f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
4500: 73 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77  se of the cell w
4510: 65 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  e are pointing a
4520: 74 20 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67  t */.  u8 wrFlag
4530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4540: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 69 74   /* True if writ
4550: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 65 53 74  able */.  u8 eSt
4560: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
4570: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
4580: 65 20 43 55 52 53 4f 52 5f 58 58 58 20 63 6f 6e  e CURSOR_XXX con
4590: 73 74 61 6e 74 73 20 28 73 65 65 20 62 65 6c 6f  stants (see belo
45a0: 77 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4b  w) */.  void *pK
45b0: 65 79 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  ey;      /* Save
45c0: 64 20 6b 65 79 20 74 68 61 74 20 77 61 73 20 63  d key that was c
45d0: 75 72 73 6f 72 27 73 20 6c 61 73 74 20 6b 6e 6f  ursor's last kno
45e0: 77 6e 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20  wn position */. 
45f0: 20 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20   i64 nKey;      
4600: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
4610: 79 2c 20 6f 72 20 6c 61 73 74 20 69 6e 74 65 67  y, or last integ
4620: 65 72 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  er key */.  int 
4630: 73 6b 69 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  skip;        /* 
4640: 28 73 6b 69 70 3c 30 29 20 2d 3e 20 50 72 65 76  (skip<0) -> Prev
4650: 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 28  () is a no-op. (
4660: 73 6b 69 70 3e 30 29 20 2d 3e 20 4e 65 78 74 28  skip>0) -> Next(
4670: 29 20 69 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ) is */.};../*.*
4680: 2a 20 50 6f 74 65 6e 74 69 61 6c 20 76 61 6c 75  * Potential valu
4690: 65 73 20 66 6f 72 20 42 74 43 75 72 73 6f 72 2e  es for BtCursor.
46a0: 65 53 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 43 55  eState..**.** CU
46b0: 52 53 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a 20 20  RSOR_VALID:.**  
46c0: 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   Cursor points t
46d0: 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  o a valid entry.
46e0: 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 65 74   getPayload() et
46f0: 63 2e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  c. may be called
4700: 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49  ..**.** CURSOR_I
4710: 4e 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72  NVALID:.**   Cur
4720: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69  sor does not poi
4730: 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  nt to a valid en
4740: 74 72 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61  try. This can ha
4750: 70 70 65 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c  ppen (for exampl
4760: 65 29 20 0a 2a 2a 20 20 20 62 65 63 61 75 73 65  e) .**   because
4770: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
4780: 70 74 79 20 6f 72 20 62 65 63 61 75 73 65 20 42  pty or because B
4790: 74 72 65 65 43 75 72 73 6f 72 46 69 72 73 74 28  treeCursorFirst(
47a0: 29 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a  ) has not been.*
47b0: 2a 20 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a  *   called..**.*
47c0: 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
47d0: 53 45 45 4b 3a 0a 2a 2a 20 20 20 54 68 65 20 74  SEEK:.**   The t
47e0: 61 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 63  able that this c
47f0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
4800: 20 6f 6e 20 73 74 69 6c 6c 20 65 78 69 73 74 73   on still exists
4810: 2c 20 62 75 74 20 68 61 73 20 62 65 65 6e 20 0a  , but has been .
4820: 2a 2a 20 20 20 6d 6f 64 69 66 69 65 64 20 73 69  **   modified si
4830: 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  nce the cursor w
4840: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 54 68  as last used. Th
4850: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
4860: 6e 20 69 73 20 73 61 76 65 64 0a 2a 2a 20 20 20  n is saved.**   
4870: 69 6e 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  in variables BtC
4880: 75 72 73 6f 72 2e 70 4b 65 79 20 61 6e 64 20 42  ursor.pKey and B
4890: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 2e 20 57 68  tCursor.nKey. Wh
48a0: 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 69  en a cursor is i
48b0: 6e 20 0a 2a 2a 20 20 20 74 68 69 73 20 73 74 61  n .**   this sta
48c0: 74 65 2c 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  te, restoreOrCle
48d0: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
48e0: 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
48f0: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a   to attempt to.*
4900: 2a 20 20 20 73 65 65 6b 20 74 68 65 20 63 75 72  *   seek the cur
4910: 73 6f 72 20 74 6f 20 74 68 65 20 73 61 76 65 64  sor to the saved
4920: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 64   position..*/.#d
4930: 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 49 4e 56  efine CURSOR_INV
4940: 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 30  ALID           0
4950: 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f  .#define CURSOR_
4960: 56 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20  VALID           
4970: 20 20 31 0a 23 64 65 66 69 6e 65 20 43 55 52 53    1.#define CURS
4980: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 20  OR_REQUIRESEEK  
4990: 20 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68       2../*.** Th
49a0: 65 20 54 52 41 43 45 20 6d 61 63 72 6f 20 77 69  e TRACE macro wi
49b0: 6c 6c 20 70 72 69 6e 74 20 68 69 67 68 2d 6c 65  ll print high-le
49c0: 76 65 6c 20 73 74 61 74 75 73 20 69 6e 66 6f 72  vel status infor
49d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
49e0: 0a 2a 2a 20 62 74 72 65 65 20 6f 70 65 72 61 74  .** btree operat
49f0: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 67 6c 6f  ion when the glo
4a00: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 73 71 6c  bal variable sql
4a10: 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65  ite3_btree_trace
4a20: 20 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 2e 0a   is.** enabled..
4a30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
4a40: 53 54 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43  ST.# define TRAC
4a50: 45 28 58 29 20 20 20 69 66 28 20 73 71 6c 69 74  E(X)   if( sqlit
4a60: 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20 29  e3_btree_trace )
4a70: 5c 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20  \./*            
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71              { sq
4a90: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4aa0: 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75   X; fflush(stdou
4ab0: 74 29 3b 20 7d 20 2a 2f 20 5c 0a 7b 20 70 72 69  t); } */ \.{ pri
4ac0: 6e 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74  ntf X; fflush(st
4ad0: 64 6f 75 74 29 3b 20 7d 0a 69 6e 74 20 73 71 6c  dout); }.int sql
4ae0: 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65  ite3_btree_trace
4af0: 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
4b00: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
4b10: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
4b20: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
4b30: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
4b40: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
4b50: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
4b60: 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c  eadLocks(Btree*,
4b70: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
4b80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20  ../*.** Read or 
4b90: 77 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e 64  write a two- and
4ba0: 20 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d 65   four-byte big-e
4bb0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ndian integer va
4bc0: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
4bd0: 75 33 32 20 67 65 74 32 62 79 74 65 28 75 6e 73  u32 get2byte(uns
4be0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a  igned char *p){.
4bf0: 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c    return (p[0]<<
4c00: 38 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61  8) | p[1];.}.sta
4c10: 74 69 63 20 75 33 32 20 67 65 74 34 62 79 74 65  tic u32 get4byte
4c20: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4c30: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b  p){.  return (p[
4c40: 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c  0]<<24) | (p[1]<
4c50: 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29  <16) | (p[2]<<8)
4c60: 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69   | p[3];.}.stati
4c70: 63 20 76 6f 69 64 20 70 75 74 32 62 79 74 65 28  c void put2byte(
4c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4c90: 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d  , u32 v){.  p[0]
4ca0: 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20   = v>>8;.  p[1] 
4cb0: 3d 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = v;.}.static vo
4cc0: 69 64 20 70 75 74 34 62 79 74 65 28 75 6e 73 69  id put4byte(unsi
4cd0: 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33  gned char *p, u3
4ce0: 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76  2 v){.  p[0] = v
4cf0: 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76  >>24;.  p[1] = v
4d00: 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76  >>16;.  p[2] = v
4d10: 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b  >>8;.  p[3] = v;
4d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  .}../*.** Routin
4d30: 65 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77  es to read and w
4d40: 72 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c 65  rite variable-le
4d50: 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20  ngth integers.  
4d60: 54 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a  These used to.**
4d70: 20 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63 61   be defined loca
4d80: 6c 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65 20  lly, but now we 
4d90: 75 73 65 20 74 68 65 20 76 61 72 69 6e 74 20 72  use the varint r
4da0: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 75  outines in the u
4db0: 74 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  til.c.** file..*
4dc0: 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61 72  /.#define getVar
4dd0: 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47 65  int    sqlite3Ge
4de0: 74 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65 66 69  tVarint./* #defi
4df0: 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32 20 20  ne getVarint32  
4e00: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
4e10: 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  32 */.#define ge
4e20: 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20 20  tVarint32(A,B)  
4e30: 28 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78 37 66  ((*B=*(A))<=0x7f
4e40: 3f 31 3a 73 71 6c 69 74 65 33 47 65 74 56 61 72  ?1:sqlite3GetVar
4e50: 69 6e 74 33 32 28 41 2c 42 29 29 0a 23 64 65 66  int32(A,B)).#def
4e60: 69 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20 20  ine putVarint   
4e70: 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e   sqlite3PutVarin
4e80: 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62 61  t../* The databa
4e90: 73 65 20 70 61 67 65 20 74 68 65 20 50 45 4e 44  se page the PEND
4ea0: 49 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69 65  ING_BYTE occupie
4eb0: 73 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20  s. This page is 
4ec0: 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20 54  never used..** T
4ed0: 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ODO: This macro 
4ee0: 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 79  is very similary
4ef0: 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   to PAGER_MJ_PGN
4f00: 4f 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e 20  O() in pager.c. 
4f10: 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 70  They.** should p
4f20: 6f 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73 6f  ossibly be conso
4f30: 6c 69 64 61 74 65 64 20 28 70 72 65 73 75 6d 61  lidated (presuma
4f40: 62 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29 2e  bly in pager.h).
4f50: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b 20 49  .**.** If disk I
4f60: 2f 4f 20 69 73 20 6f 6d 69 74 74 65 64 20 28 6d  /O is omitted (m
4f70: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20  eaning that the 
4f80: 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72  database is stor
4f90: 65 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69 6e 20  ed purely.** in 
4fa0: 6d 65 6d 6f 72 79 29 20 74 68 65 6e 20 74 68 65  memory) then the
4fb0: 72 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e 67  re is no pending
4fc0: 20 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   byte..*/.#ifdef
4fd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
4fe0: 4b 49 4f 0a 23 20 64 65 66 69 6e 65 20 50 45 4e  KIO.# define PEN
4ff0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
5000: 42 74 29 20 20 30 78 37 66 66 66 66 66 66 66 0a  Bt)  0x7fffffff.
5010: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
5020: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
5030: 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47 5f  (pBt) ((PENDING_
5040: 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67 65  BYTE/(pBt)->page
5050: 53 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69 66 0a  Size)+1).#endif.
5060: 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64 20  ./*.** A linked 
5070: 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  list of the foll
5080: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73  owing structures
5090: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 42 74   is stored at Bt
50a0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a 2a  Shared.pLock..**
50b0: 20 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65 64   Locks are added
50c0: 20 28 6f 72 20 75 70 67 72 61 64 65 64 20 66 72   (or upgraded fr
50d0: 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f 20  om READ_LOCK to 
50e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65 6e  WRITE_LOCK) when
50f0: 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73   a cursor .** is
5100: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 74   opened on the t
5110: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
5120: 61 67 65 20 42 74 53 68 61 72 65 64 2e 69 54 61  age BtShared.iTa
5130: 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20 72  ble. Locks are r
5140: 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  emoved.** from t
5150: 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61 20  his list when a 
5160: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5170: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
5180: 65 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65 6e  ed back, or when
5190: 0a 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e 64  .** a btree hand
51a0: 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  le is closed..*/
51b0: 0a 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20 7b  .struct BtLock {
51c0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
51d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65  ;        /* Btre
51e0: 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e 67  e handle holding
51f0: 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20 20   this lock */.  
5200: 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20 20  Pgno iTable;    
5210: 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
5220: 67 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  ge of table */. 
5230: 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20   u8 eLock;      
5240: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c         /* READ_L
5250: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
5260: 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  K */.  BtLock *p
5270: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  Next;        /* 
5280: 4e 65 78 74 20 69 6e 20 42 74 53 68 61 72 65 64  Next in BtShared
5290: 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 7d  .pLock list */.}
52a0: 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65 20  ;../* Candidate 
52b0: 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f 63  values for BtLoc
52c0: 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69  k.eLock */.#defi
52d0: 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20 20  ne READ_LOCK    
52e0: 20 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45   1.#define WRITE
52f0: 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66 64  _LOCK    2..#ifd
5300: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5310: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
5320: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
5330: 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ons queryTableLo
5340: 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28  ck(), lockTable(
5350: 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54  ) and unlockAllT
5360: 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e  ables().  ** man
5370: 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20  ipulate entries 
5380: 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  in the BtShared.
5390: 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73  pLock linked lis
53a0: 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  t used to store.
53b0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
53c0: 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f  e table level lo
53d0: 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72  cks. If the libr
53e0: 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ary is compiled 
53f0: 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68  with the.  ** sh
5400: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
5410: 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  re disabled, the
5420: 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  n there is only 
5430: 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20  ever one user.  
5440: 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61  ** of each BtSha
5450: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e  red structure an
5460: 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e  d so this lockin
5470: 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  g is not necessa
5480: 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66  ry. .  ** So def
5490: 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c  ine the lock rel
54a0: 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61  ated functions a
54b0: 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20  s no-ops..  */. 
54c0: 20 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61   #define queryTa
54d0: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
54e0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
54f0: 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62  ne lockTable(a,b
5500: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
5510: 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c  #define unlockAl
5520: 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6c 73 65  lTables(a).#else
5530: 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  .../*.** Query t
5540: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
5550: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
5560: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
5570: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
5580: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
5590: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
55a0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
55b0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
55c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
55d0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
55e0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
55f0: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
5600: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
5610: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
5620: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
5630: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
5640: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
5650: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
5660: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
5670: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
5680: 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Iter;..  /* This
5690: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
56a0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
56b0: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
56c0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
56d0: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
56e0: 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65  Only()->useShare
56f0: 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74  dData ){.    ret
5700: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5710: 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61   }..  /* This (a
5720: 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61  long with lockTa
5730: 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65 20  ble()) is where 
5740: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
5750: 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a  ted flag is.  **
5760: 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20   dealt with. If 
5770: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75  the caller is qu
5780: 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61  erying for a rea
5790: 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66  d-lock and the f
57a0: 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c  lag is.  ** set,
57b0: 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69   it is unconditi
57c0: 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d  onally granted -
57d0: 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61   even if there a
57e0: 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20  re write-locks. 
57f0: 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   ** on the table
5800: 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  . If a write-loc
5810: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
5820: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
5830: 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  ted flag.  ** is
5840: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
5850: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75  .  **.  ** In fu
5860: 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65  nction lockTable
5870: 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f  (), if a read-lo
5880: 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61  ck is demanded a
5890: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61  nd the .  ** Rea
58a0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
58b0: 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74  g is set, no ent
58c0: 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ry is added to t
58d0: 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20  he locks list . 
58e0: 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c   ** (BtShared.pL
58f0: 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ock)..  **.  ** 
5900: 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66  To summarize: If
5910: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
5920: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
5930: 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72 73  , then read curs
5940: 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20  ors do.  ** not 
5950: 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65 63  create or respec
5960: 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54  t table locks. T
5970: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65  he locking proce
5980: 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a  dure for a .  **
5990: 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f   write-cursor do
59a0: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20  es not change.. 
59b0: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 21   */.  if( .    !
59c0: 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a 20  p->pSqlite || . 
59d0: 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69 74     0==(p->pSqlit
59e0: 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  e->flags&SQLITE_
59f0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
5a00: 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d   || .    eLock==
5a10: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20  WRITE_LOCK ||.  
5a20: 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52    iTab==MASTER_R
5a30: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  OOT.  ){.    for
5a40: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
5a50: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
5a60: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
5a70: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
5a80: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
5a90: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
5aa0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
5ab0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
5ac0: 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45  ock || eLock!=RE
5ad0: 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  AD_LOCK) ){.    
5ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5af0: 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
5b00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5b10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
5b30: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
5b40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5b50: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
5b60: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
5b70: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
5b80: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
5b90: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
5ba0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
5bb0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
5bc0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
5bd0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5be0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
5bf0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
5c00: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
5c10: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
5c20: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74   may also be ret
5c30: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
5c40: 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42   int lockTable(B
5c50: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
5c60: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
5c70: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
5c80: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
5c90: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
5ca0: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
5cb0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  ..  /* This is a
5cc0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
5cd0: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
5ce0: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
5cf0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72  f( 0==sqlite3Thr
5d00: 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
5d10: 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61  )->useSharedData
5d20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5d30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5d40: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
5d50: 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f  OK==queryTableLo
5d60: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
5d70: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
5d80: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
5d90: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
5da0: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
5db0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a  k is requested,.
5dc0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
5dd0: 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67  y without adding
5de0: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
5df0: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
5e00: 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63  list. See.  ** c
5e10: 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69  omment in functi
5e20: 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  on queryTableLoc
5e30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
5e40: 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20  o on handling . 
5e50: 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f   ** the ReadUnco
5e60: 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20  mmitted flag..  
5e70: 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70  */.  if( .    (p
5e80: 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20  ->pSqlite) && . 
5e90: 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e     (p->pSqlite->
5ea0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
5eb0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26  dUncommitted) &&
5ec0: 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45   .    (eLock==RE
5ed0: 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20  AD_LOCK) &&.    
5ee0: 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52  iTable!=MASTER_R
5ef0: 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  OOT.  ){.    ret
5f00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5f10: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73   }..  /* First s
5f20: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
5f30: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
5f40: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
5f50: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
5f60: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
5f70: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
5f80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f90: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
5fa0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
5fb0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
5fc0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
5fd0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
5fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5ff0: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
6000: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
6010: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
6020: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
6030: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
6040: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
6050: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
6060: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
6070: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
6080: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
6090: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
60a0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69  )sqliteMalloc(si
60b0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
60c0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
60d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
60e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
60f0: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
6100: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
6110: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
6120: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
6130: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
6140: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
6150: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
6160: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
6170: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
6180: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
6190: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
61a0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
61b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
61c0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
61d0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
61e0: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
61f0: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
6200: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
6210: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
6220: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
6230: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
6240: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
6250: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
6260: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
6270: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
6280: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
6290: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
62a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
62b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
62c0: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
62d0: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
62e0: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
62f0: 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29   the lockTable()
6300: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68  .** procedure) h
6310: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
6320: 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  dle p..*/.static
6330: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54   void unlockAllT
6340: 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b  ables(Btree *p){
6350: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
6360: 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c  er = &p->pBt->pL
6370: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
6380: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 65  e shared-cache e
6390: 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74 20  xtension is not 
63a0: 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20 73  enabled, there s
63b0: 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a 2a  hould be no.  **
63c0: 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42 74   locks in the Bt
63d0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
63e0: 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 70  t, making this p
63f0: 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f 70  rocedure a no-op
6400: 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74 68  . Assert.  ** th
6410: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
6420: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
6430: 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65 61  rt( sqlite3Threa
6440: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
6450: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 7c  >useSharedData |
6460: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
6470: 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65  .  while( *ppIte
6480: 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  r ){.    BtLock 
6490: 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72  *pLock = *ppIter
64a0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
64b0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
64c0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
64d0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
64e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f    sqliteFree(pLo
64f0: 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
6500: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
6510: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
6520: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
6530: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6540: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
6550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
6560: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
6570: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
6580: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
6590: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  */../*.** Save t
65a0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
65b0: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
65c0: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
65d0: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
65e0: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
65f0: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
6600: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
6610: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6630: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6640: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6650: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
6660: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6670: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6680: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
6690: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
66a0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
66b0: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
66c0: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
66d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
66e0: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
66f0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
6700: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
6710: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
6720: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
6730: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
6740: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
6750: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
6760: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
6770: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
6780: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
6790: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
67a0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
67b0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
67c0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
67d0: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
67e0: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
67f0: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
6800: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6810: 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e  _OK && 0==pCur->
6820: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a  pPage->intKey){.
6830: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
6840: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 43   sqliteMalloc(pC
6850: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69  ur->nKey);.    i
6860: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
6870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6880: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70  eeKey(pCur, 0, p
6890: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
68a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
68b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
68c0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
68d0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
68e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
68f0: 69 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20  iteFree(pKey);. 
6900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6910: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6920: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
6940: 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
6950: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
6960: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
6970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6980: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
6990: 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
69a0: 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b  pCur->pPage = 0;
69b0: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
69c0: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
69d0: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72  RESEEK;.  }..  r
69e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
69f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
6a00: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
6a10: 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63  sors except pExc
6a20: 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ept open on the 
6a30: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
6a40: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
6a50: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
6a60: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
6a70: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
6a80: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
6a90: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
6aa0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
6ab0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
6ac0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
6ad0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
6ae0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6af0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
6b00: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
6b10: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
6b20: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
6b30: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
6b40: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
6b50: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
6b60: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
6b70: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
6b80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
6b90: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
6ba0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
6bb0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
6bc0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
6bd0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
6be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6bf0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
6c00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6c10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6c20: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
6c30: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
6c40: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
6c50: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
6c60: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
6c70: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
6c80: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
6c90: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
6ca0: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
6cb0: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
6cc0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
6cd0: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
6ce0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
6cf0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
6d00: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
6d10: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
6d20: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
6d30: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
6d40: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
6d50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6d60: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
6d70: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6d80: 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65  argument - doSee
6d90: 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68  k - is false, th
6da0: 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a  en instead of .*
6db0: 2a 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  * returning the 
6dc0: 63 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73  cursor to it's s
6dd0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61  aved position, a
6de0: 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ny saved positio
6df0: 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  n is deleted.** 
6e00: 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
6e10: 74 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53  tate set to CURS
6e20: 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73  OR_INVALID..*/.s
6e30: 74 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72  tatic int restor
6e40: 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
6e50: 73 69 74 69 6f 6e 58 28 42 74 43 75 72 73 6f 72  sitionX(BtCursor
6e60: 20 2a 70 43 75 72 2c 20 69 6e 74 20 64 6f 53 65   *pCur, int doSe
6e70: 65 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ek){.  int rc = 
6e80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
6e90: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6ea0: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
6eb0: 45 53 45 45 4b 20 29 3b 0a 20 20 70 43 75 72 2d  ESEEK );.  pCur-
6ec0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6ed0: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 69 66 28 20  _INVALID;.  if( 
6ee0: 64 6f 53 65 65 6b 20 29 7b 0a 20 20 20 20 72 63  doSeek ){.    rc
6ef0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f00: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
6f10: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
6f20: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6f30: 69 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ip);.  }.  if( r
6f40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6f50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
6f60: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6f70: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6f80: 20 20 20 20 61 73 73 65 72 74 28 20 43 55 52 53      assert( CURS
6f90: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
6fa0: 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52  eState || CURSOR
6fb0: 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
6fc0: 65 53 74 61 74 65 20 29 3b 0a 20 20 7d 0a 20 20  eState );.  }.  
6fd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
6fe0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43  efine restoreOrC
6ff0: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
7000: 6f 6e 28 70 2c 78 29 20 5c 0a 20 20 28 70 2d 3e  on(p,x) \.  (p->
7010: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52  eState==CURSOR_R
7020: 45 51 55 49 52 45 53 45 45 4b 3f 72 65 73 74 6f  EQUIRESEEK?resto
7030: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
7040: 6f 73 69 74 69 6f 6e 58 28 70 2c 78 29 3a 53 51  ositionX(p,x):SQ
7050: 4c 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65  LITE_OK)..#ifnde
7060: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7070: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
7080: 68 65 73 65 20 6d 61 63 72 6f 73 20 64 65 66 69  hese macros defi
7090: 6e 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ne the location 
70a0: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
70b0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 61 20 0a  ap entry for a .
70c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
70d0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
70e0: 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20  ment to each is 
70f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
7100: 61 62 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e  able.** bytes on
7110: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 74 68   each page of th
7120: 65 20 64 61 74 61 62 61 73 65 20 28 6f 66 74 65  e database (ofte
7130: 6e 20 31 30 32 34 29 2e 20 54 68 65 20 73 65 63  n 1024). The sec
7140: 6f 6e 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ond is the.** pa
7150: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f  ge number to loo
7160: 6b 20 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e  k up in the poin
7170: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50  ter map..**.** P
7180: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65 74  TRMAP_PAGENO ret
7190: 75 72 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  urns the databas
71a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
71b0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
71c0: 0a 2a 2a 20 70 61 67 65 20 74 68 61 74 20 73 74  .** page that st
71d0: 6f 72 65 73 20 74 68 65 20 72 65 71 75 69 72 65  ores the require
71e0: 64 20 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41  d pointer. PTRMA
71f0: 50 5f 50 54 52 4f 46 46 53 45 54 20 72 65 74 75  P_PTROFFSET retu
7200: 72 6e 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  rns.** the offse
7210: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
7220: 65 64 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a  ed map entry..**
7230: 0a 2a 2a 20 49 66 20 74 68 65 20 70 67 6e 6f 20  .** If the pgno 
7240: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
7250: 74 6f 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  to PTRMAP_PAGENO
7260: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   is a pointer-ma
7270: 70 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  p page,.** then 
7280: 70 67 6e 6f 20 69 73 20 72 65 74 75 72 6e 65 64  pgno is returned
7290: 2e 20 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d  . So (pgno==PTRM
72a0: 41 50 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20  AP_PAGENO(pgsz, 
72b0: 70 67 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a  pgno)) can be.**
72c0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66   used to test if
72d0: 20 70 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74   pgno is a point
72e0: 65 72 2d 6d 61 70 20 70 61 67 65 2e 20 50 54 52  er-map page. PTR
72f0: 4d 41 50 5f 49 53 50 41 47 45 20 69 6d 70 6c 65  MAP_ISPAGE imple
7300: 6d 65 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74 65  ments.** this te
7310: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  st..*/.#define P
7320: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
7330: 2c 20 70 67 6e 6f 29 20 70 74 72 6d 61 70 50 61  , pgno) ptrmapPa
7340: 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 0a  geno(pBt, pgno).
7350: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50  #define PTRMAP_P
7360: 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20 70 67  TROFFSET(pBt, pg
7370: 6e 6f 29 20 28 35 2a 28 70 67 6e 6f 2d 70 74 72  no) (5*(pgno-ptr
7380: 6d 61 70 50 61 67 65 6e 6f 28 70 42 74 2c 20 70  mapPageno(pBt, p
7390: 67 6e 6f 29 2d 31 29 29 0a 23 64 65 66 69 6e 65  gno)-1)).#define
73a0: 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
73b0: 42 74 2c 20 70 67 6e 6f 29 20 28 50 54 52 4d 41  Bt, pgno) (PTRMA
73c0: 50 5f 50 41 47 45 4e 4f 28 28 70 42 74 29 2c 28  P_PAGENO((pBt),(
73d0: 70 67 6e 6f 29 29 3d 3d 28 70 67 6e 6f 29 29 0a  pgno))==(pgno)).
73e0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
73f0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
7400: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
7410: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
7420: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7430: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7440: 29 2b 31 3b 0a 20 20 69 6e 74 20 69 50 74 72 4d  )+1;.  int iPtrM
7450: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
7460: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
7470: 20 20 69 6e 74 20 72 65 74 20 3d 20 28 69 50 74    int ret = (iPt
7480: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7490: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
74a0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
74b0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
74c0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
74d0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
74e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ../*.** The poin
74f0: 74 65 72 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f  ter map is a loo
7500: 6b 75 70 20 74 61 62 6c 65 20 74 68 61 74 20 69  kup table that i
7510: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
7520: 72 65 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a  rent page for.**
7530: 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
7540: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7550: 20 66 69 6c 65 2e 20 20 54 68 65 20 70 61 72 65   file.  The pare
7560: 6e 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nt page is the p
7570: 61 67 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74  age that.** cont
7580: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
7590: 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 45 76  o the child.  Ev
75a0: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
75b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
75c0: 73 0a 2a 2a 20 30 20 6f 72 20 31 20 70 61 72 65  s.** 0 or 1 pare
75d0: 6e 74 20 70 61 67 65 73 2e 20 20 28 49 6e 20 74  nt pages.  (In t
75e0: 68 69 73 20 63 6f 6e 74 65 78 74 20 27 64 61 74  his context 'dat
75f0: 61 62 61 73 65 20 70 61 67 65 27 20 72 65 66 65  abase page' refe
7600: 72 73 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67  rs.** to any pag
7610: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61  e that is not pa
7620: 72 74 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  rt of the pointe
7630: 72 20 6d 61 70 20 69 74 73 65 6c 66 2e 29 20 20  r map itself.)  
7640: 45 61 63 68 20 70 6f 69 6e 74 65 72 20 6d 61 70  Each pointer map
7650: 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69 73  .** entry consis
7660: 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62  ts of a single b
7670: 79 74 65 20 27 74 79 70 65 27 20 61 6e 64 20 61  yte 'type' and a
7680: 20 34 20 62 79 74 65 20 70 61 72 65 6e 74 20 70   4 byte parent p
7690: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54  age number..** T
76a0: 68 65 20 50 54 52 4d 41 50 5f 58 58 58 20 69 64  he PTRMAP_XXX id
76b0: 65 6e 74 69 66 69 65 72 73 20 62 65 6c 6f 77 20  entifiers below 
76c0: 61 72 65 20 74 68 65 20 76 61 6c 69 64 20 74 79  are the valid ty
76d0: 70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  pes..**.** The p
76e0: 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 70 6f  urpose of the po
76f0: 69 6e 74 65 72 20 6d 61 70 20 69 73 20 74 6f 20  inter map is to 
7700: 66 61 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20  facility moving 
7710: 70 61 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a  pages from one.*
7720: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  * position in th
7730: 65 20 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65  e file to anothe
7740: 72 20 61 73 20 70 61 72 74 20 6f 66 20 61 75 74  r as part of aut
7750: 6f 76 61 63 75 75 6d 2e 20 20 57 68 65 6e 20 61  ovacuum.  When a
7760: 20 70 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65   page.** is move
7770: 64 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  d, the pointer i
7780: 6e 20 69 74 73 20 70 61 72 65 6e 74 20 6d 75 73  n its parent mus
7790: 74 20 62 65 20 75 70 64 61 74 65 64 20 74 6f 20  t be updated to 
77a0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
77b0: 6e 65 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  new location.  T
77c0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
77d0: 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
77e0: 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
77f0: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20   quickly..**.** 
7800: 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a  PTRMAP_ROOTPAGE:
7810: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
7820: 67 65 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  ge is a root-pag
7830: 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62  e. The page-numb
7840: 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  er is not.**    
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
7860: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
7870: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52  .**.** PTRMAP_FR
7880: 45 45 50 41 47 45 3a 20 54 68 65 20 64 61 74 61  EEPAGE: The data
7890: 62 61 73 65 20 70 61 67 65 20 69 73 20 61 6e 20  base page is an 
78a0: 75 6e 75 73 65 64 20 28 66 72 65 65 29 20 70 61  unused (free) pa
78b0: 67 65 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d  ge. The page-num
78c0: 62 65 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ber .**         
78d0: 20 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20           is not 
78e0: 75 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  used in this cas
78f0: 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
7900: 4f 56 45 52 46 4c 4f 57 31 3a 20 54 68 65 20 64  OVERFLOW1: The d
7910: 61 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20  atabase page is 
7920: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
7930: 6e 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  n a list of .** 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    overflow pages
7960: 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
7970: 72 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  r identifies the
7980: 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 20 20   page that.**   
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
79b0: 6c 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72  l with a pointer
79c0: 20 74 6f 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   to this overflo
79d0: 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54  w page..**.** PT
79e0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
79f0: 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  The database pag
7a00: 65 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  e is the second 
7a10: 6f 72 20 6c 61 74 65 72 20 70 61 67 65 20 69 6e  or later page in
7a20: 20 61 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20   a list of.**   
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7a50: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
7a60: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
7a70: 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  revious.**      
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
7a90: 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
7aa0: 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a  w page list..**.
7ab0: 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
7ac0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
7ad0: 67 65 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74  ge is a non-root
7ae0: 20 62 74 72 65 65 20 70 61 67 65 2e 20 54 68 65   btree page. The
7af0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 64                id
7b10: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72  entifies the par
7b20: 65 6e 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ent page in the 
7b30: 62 74 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  btree..*/.#defin
7b40: 65 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  e PTRMAP_ROOTPAG
7b50: 45 20 31 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  E 1.#define PTRM
7b60: 41 50 5f 46 52 45 45 50 41 47 45 20 32 0a 23 64  AP_FREEPAGE 2.#d
7b70: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45  efine PTRMAP_OVE
7b80: 52 46 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e 65  RFLOW1 3.#define
7b90: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
7ba0: 32 20 34 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  2 4.#define PTRM
7bb0: 41 50 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a  AP_BTREE 5../*.*
7bc0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
7bd0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
7be0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
7bf0: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
7c00: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7c10: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7c20: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
7c30: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
7c40: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
7c50: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
7c60: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
7c70: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
7c80: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
7c90: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7ca0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
7cb0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
7cc0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
7cd0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
7ce0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
7cf0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
7d00: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
7d10: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
7d20: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7d30: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
7d40: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
7d50: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
7d60: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
7d70: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
7d80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7d90: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7da0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
7db0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
7dc0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
7dd0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
7de0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7df0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
7e00: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
7e10: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
7e20: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
7e30: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
7e40: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
7e50: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
7e60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
7e70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
7e80: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
7e90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7ea0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7eb0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7ec0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7ed0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7ee0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7ef0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7f00: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
7f10: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7f20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
7f30: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66  urn rc;.  }.  of
7f40: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
7f50: 52 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79  ROFFSET(pBt, key
7f60: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7f70: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7f80: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7f90: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7fa0: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7fb0: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
7fc0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
7fd0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
7fe0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
7ff0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
8000: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
8010: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
8020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8030: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
8040: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
8050: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8060: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
8070: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
8080: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
8090: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
80a0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
80b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
80c0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
80d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
80e0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
80f0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
8100: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
8110: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
8120: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
8130: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8140: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
8150: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
8160: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
8170: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
8180: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
8190: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
81a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
81b0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
81c0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
81d0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
81e0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
81f0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8200: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8210: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8220: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8230: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8240: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8250: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8260: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
8270: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8280: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
8290: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
82a0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
82b0: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
82c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
82d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
82e0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
82f0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8300: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d  int rc;..  iPtrm
8310: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8320: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8330: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8340: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8350: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8360: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
8370: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8380: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8390: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
83a0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
83b0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
83c0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
83d0: 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a  FSET(pBt, key);.
83e0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
83f0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8400: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8410: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8420: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8430: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8440: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8450: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8460: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8470: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8480: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8490: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
84a0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
84b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
84c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
84d0: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  AUTOVACUUM */../
84e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
84f0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
8500: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
8510: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8520: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
8530: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
8540: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
8550: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
8560: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
8570: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
8580: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8590: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
85a0: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
85b0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
85c0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
85d0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 43  static u8 *findC
85e0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
85f0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
8600: 20 20 75 38 20 2a 64 61 74 61 20 3d 20 70 50 61    u8 *data = pPa
8610: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73  ge->aData;.  ass
8620: 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b  ert( iCell>=0 );
8630: 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c  .  assert( iCell
8640: 3c 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  <get2byte(&data[
8650: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
8660: 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  +3]) );.  return
8670: 20 64 61 74 61 20 2b 20 67 65 74 32 62 79 74 65   data + get2byte
8680: 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65  (&data[pPage->ce
8690: 6c 6c 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c  llOffset+2*iCell
86a0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]);.}../*.** Thi
86b0: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
86c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64   version of find
86d0: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
86e0: 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74  s for.** pages t
86f0: 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f  hat do contain o
8700: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20  verflow cells.  
8710: 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74  See insert.*/.st
8720: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65  atic u8 *findOve
8730: 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67  rflowCell(MemPag
8740: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
8750: 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ell){.  int i;. 
8760: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
8770: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
8780: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
8790: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
87a0: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
87b0: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
87c0: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
87d0: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
87e0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
87f0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
8800: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
8810: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
8820: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
8830: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
8840: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8850: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
8860: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
8870: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8880: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8890: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
88a0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
88b0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
88c0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
88d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
88e0: 70 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  parseCell() take
88f0: 73 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a  s a cell index.*
8900: 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
8910: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72  argument and par
8920: 73 65 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65  seCellPtr() take
8930: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
8940: 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68  he.** body of th
8950: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
8960: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
8970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8980: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
8990: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
89a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
89b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
89c0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
89d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
89e0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
89f0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
8a00: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
8a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
8a20: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
8a30: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
8a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
8a60: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
8a70: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
8a80: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
8a90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8aa0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
8ab0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
8ac0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
8ad0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
8ae0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
8af0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
8b00: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
8b10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
8b20: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
8b30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
8b40: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
8b50: 61 74 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ata ){.    n += 
8b60: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
8b70: 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64  ll[n], &nPayload
8b80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8b90: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
8ba0: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61  }.  pInfo->nData
8bb0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69   = nPayload;.  i
8bc0: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8bd0: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
8be0: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d  Varint(&pCell[n]
8bf0: 2c 20 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d  , (u64 *)&pInfo-
8c00: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
8c10: 0a 20 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20  .    u32 x;.    
8c20: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
8c30: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b  (&pCell[n], &x);
8c40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
8c50: 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f   = x;.    nPaylo
8c60: 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70  ad += x;.  }.  p
8c70: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
8c80: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
8c90: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
8ca0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
8cb0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8cc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
8cd0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
8ce0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
8cf0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
8d00: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
8d10: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8d20: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
8d30: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
8d40: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  */.    int nSize
8d50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
8d60: 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  tal size of cell
8d70: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65   content in byte
8d80: 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  s */.    pInfo->
8d90: 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61  nLocal = nPayloa
8da0: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
8db0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
8dc0: 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61   nSize = nPayloa
8dd0: 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e  d + n;.    if( n
8de0: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20  Size<4 ){.      
8df0: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
8e00: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
8e10: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
8e20: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
8e30: 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20  nSize = nSize;. 
8e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
8e50: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
8e60: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
8e70: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
8e80: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
8e90: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
8ea0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8eb0: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8ec0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8ed0: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
8ee0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
8ef0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
8f00: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
8f10: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
8f20: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
8f30: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8f40: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8f50: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8f60: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
8f70: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
8f80: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
8f90: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
8fa0: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
8fb0: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
8fc0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
8fd0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
8fe0: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
8ff0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9000: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9010: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
9020: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9030: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
9040: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
9050: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
9060: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
9070: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
9080: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
9090: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
90a0: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
90b0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
90c0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
90d0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
90e0: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
90f0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
9100: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
9110: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
9120: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
9130: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
9140: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
9150: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
9160: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
9170: 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70  4);.    if( surp
9180: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
9190: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
91a0: 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73  nLocal = surplus
91b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
91c0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
91d0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
91e0: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
91f0: 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d  verflow = pInfo-
9200: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20  >nLocal + n;.   
9210: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9220: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
9230: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74   + 4;.  }.}.stat
9240: 69 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c  ic void parseCel
9250: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
9260: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9270: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9280: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
9290: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
92a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
92b0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
92c0: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
92d0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
92e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
92f0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9300: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
9310: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
9320: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
9330: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
9340: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9350: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
9360: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
9370: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
9380: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
9390: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
93a0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
93b0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
93c0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
93d0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
93e0: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
93f0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
9400: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
9410: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
9420: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
9430: 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ter..*/.#ifndef 
9440: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
9450: 74 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  t cellSize(MemPa
9460: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
9470: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
9480: 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43  o info;.  parseC
9490: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
94a0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
94b0: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
94c0: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
94d0: 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  nt cellSizePtr(M
94e0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
94f0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
9500: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61  lInfo info;.  pa
9510: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
9520: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
9530: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
9540: 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Size;.}..#ifndef
9550: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9560: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
9570: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
9580: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
9590: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
95a0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
95b0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
95c0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
95d0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
95e0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
95f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
9600: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
9610: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
9620: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9630: 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70  *pCell){.  if( p
9640: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c  Cell ){.    Cell
9650: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
9660: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
9670: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
9680: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69  ;.    assert( (i
9690: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
96a0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
96b0: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
96c0: 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28  yload );.    if(
96d0: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
96e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
96f0: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
9700: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50  Local ){.      P
9710: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
9720: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
9730: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
9740: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
9750: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
9760: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
9770: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
9780: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
9790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
97a0: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
97b0: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
97c0: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
97d0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
97e0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
97f0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
9800: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
9810: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9820: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9830: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9850: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
9860: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9870: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
9880: 43 65 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  Cell;.  pCell = 
9890: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
98a0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
98b0: 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50    return ptrmapP
98c0: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
98d0: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69   pCell);.}.#endi
98e0: 66 0a 0a 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f  f.../* A bunch o
98f0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
9900: 6d 65 6e 74 73 20 74 6f 20 63 68 65 63 6b 20 74  ments to check t
9910: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
9920: 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 0a 2a  tate variables.*
9930: 2a 20 6f 66 20 68 61 6e 64 6c 65 20 70 20 28 74  * of handle p (t
9940: 79 70 65 20 42 74 72 65 65 2a 29 20 61 72 65 20  ype Btree*) are 
9950: 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
9960: 73 74 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  stent..*/.#defin
9970: 65 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79  e btreeIntegrity
9980: 28 70 29 20 5c 0a 20 20 61 73 73 65 72 74 28 20  (p) \.  assert( 
9990: 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
99a0: 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74  S_NONE || p->pBt
99b0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70  ->nTransaction<p
99c0: 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c  ->pBt->nRef ); \
99d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
99e0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c  t->nTransaction<
99f0: 3d 70 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b  =p->pBt->nRef );
9a00: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   \.  assert( p->
9a10: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
9a20: 6f 6e 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c  on!=TRANS_NONE |
9a30: 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  | p->pBt->nTrans
9a40: 61 63 74 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20  action==0 ); \. 
9a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
9a60: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d  >inTransaction>=
9a70: 70 2d 3e 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a  p->inTrans ); ..
9a80: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
9a90: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
9aa0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
9ab0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
9ac0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
9ad0: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
9ae0: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
9af0: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
9b00: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
9b10: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
9b20: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
9b30: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
9b40: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
9b50: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
9b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
9b70: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
9b80: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
9b90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9bb0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
9bc0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
9bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9be0: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
9bf0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
9c00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9c10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
9c20: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
9c30: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
9c40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
9c50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9c60: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9c70: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
9c80: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
9cb0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
9cc0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
9cd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9ce0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
9cf0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
9d00: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
9d10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9d20: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
9d30: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
9d40: 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9d60: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
9d70: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9d80: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9da0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
9db0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
9dc0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9dd0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
9de0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
9df0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
9e00: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
9e10: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
9e20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
9e30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9e40: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9e50: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9e60: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9e70: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
9e80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9e90: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9ea0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
9eb0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
9ec0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
9ed0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9ee0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c  temp = sqliteMal
9ef0: 6c 6f 63 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  loc( pPage->pBt-
9f00: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69  >pageSize );.  i
9f10: 66 28 20 74 65 6d 70 3d 3d 30 20 29 20 72 65 74  f( temp==0 ) ret
9f20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9f30: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
9f40: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
9f50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9f60: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
9f70: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9f80: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
9f90: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
9fa0: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
9fb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9fc0: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
9fd0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
9fe0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
9ff0: 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28   brk = get2byte(
a000: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
a010: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72   memcpy(&temp[br
a020: 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
a030: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b  usableSize - brk
a040: 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c  );.  brk = usabl
a050: 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30  eSize;.  for(i=0
a060: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
a070: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
a080: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
a090: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
a0a0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
a0b0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
a0c0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
a0d0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
a0e0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50     assert( pc<pP
a0f0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a100: 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65  Size );.    size
a110: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
a120: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
a130: 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a  ;.    brk -= siz
a140: 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  e;.    memcpy(&d
a150: 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b  ata[brk], &temp[
a160: 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  pc], size);.    
a170: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
a180: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
a190: 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66  rt( brk>=cellOff
a1a0: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20  set+2*nCell );. 
a1b0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a1c0: 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20  hdr+5], brk);.  
a1d0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
a1e0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
a1f0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
a200: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
a210: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
a220: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
a230: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b  ta[addr], 0, brk
a240: 2d 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65  -addr);.  sqlite
a250: 46 72 65 65 28 74 65 6d 70 29 3b 0a 20 20 72 65  Free(temp);.  re
a260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a270: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
a280: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
a290: 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65   space on a page
a2a0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
a2b0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
a2c0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20  age->aData[] of 
a2d0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
a2e0: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c  f.** the new all
a2f0: 6f 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75  ocation. Or retu
a300: 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73  rn 0 if there is
a310: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65   not enough free
a320: 0a 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65  .** space on the
a330: 20 70 61 67 65 20 74 6f 20 73 61 74 69 73 66 79   page to satisfy
a340: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
a350: 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  request..**.** I
a360: 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
a370: 69 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72  ins nBytes of fr
a380: 65 65 20 73 70 61 63 65 20 62 75 74 20 64 6f 65  ee space but doe
a390: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a  s not contain.**
a3a0: 20 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69   nBytes of conti
a3b0: 67 75 6f 75 73 20 66 72 65 65 20 73 70 61 63 65  guous free space
a3c0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a3d0: 69 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ine automaticall
a3e0: 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61  y.** calls defra
a3f0: 67 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20  gementPage() to 
a400: 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20  consolidate all 
a410: 66 72 65 65 20 73 70 61 63 65 20 62 65 66 6f 72  free space befor
a420: 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  e .** allocating
a430: 20 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a   the new chunk..
a440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
a450: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
a460: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a470: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64  nByte){.  int ad
a480: 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69  dr, pc, hdr;.  i
a490: 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e  nt size;.  int n
a4a0: 46 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b  Frag;.  int top;
a4b0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
a4c0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  int cellOffset;.
a4d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a4e0: 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61  *data;.  .  data
a4f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a500: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a510: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a520: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a530: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
a540: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
a550: 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42  if( nByte<4 ) nB
a560: 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70  yte = 4;.  if( p
a570: 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74  Page->nFree<nByt
a580: 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  e || pPage->nOve
a590: 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e  rflow>0 ) return
a5a0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   0;.  pPage->nFr
a5b0: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68  ee -= nByte;.  h
a5c0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
a5d0: 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20  ffset;..  nFrag 
a5e0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
a5f0: 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b   if( nFrag<60 ){
a600: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
a610: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
a620: 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62  ing for a slot b
a630: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
a640: 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  isfy the.    ** 
a650: 73 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a  space request. *
a660: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72  /.    addr = hdr
a670: 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  +1;.    while( (
a680: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
a690: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
a6a0: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
a6b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
a6c0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2]);.      if( s
a6d0: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
a6e0: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e        if( size<n
a6f0: 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20  Byte+4 ){.      
a700: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
a710: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
a720: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
a730: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e   data[hdr+7] = n
a740: 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42  Frag + size - nB
a750: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  yte;.          r
a760: 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20  eturn pc;.      
a770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a780: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
a790: 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42  a[pc+2], size-nB
a7a0: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  yte);.          
a7b0: 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65  return pc + size
a7c0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
a7d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a7e0: 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20    addr = pc;.   
a7f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
a800: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
a810: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
a820: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
a830: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
a840: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
a850: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f  ntent area..  */
a860: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
a870: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a880: 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
a890: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
a8a0: 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  );.  cellOffset 
a8b0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
a8c0: 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  set;.  if( nFrag
a8d0: 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73  >=60 || cellOffs
a8e0: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74  et + 2*nCell > t
a8f0: 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20  op - nByte ){.  
a900: 20 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74    if( defragment
a910: 50 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65  Page(pPage) ) re
a920: 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20  turn 0;.    top 
a930: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a940: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20  [hdr+5]);.  }.  
a950: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
a960: 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73  assert( cellOffs
a970: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20  et + 2*nCell <= 
a980: 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74  top );.  put2byt
a990: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
a9a0: 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  top);.  return t
a9b0: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
a9c0: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
a9d0: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
a9e0: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
a9f0: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
aa00: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
aa10: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
aa20: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
aa30: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
aa40: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
aa50: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
aa60: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
aa70: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
aa80: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
aa90: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
aaa0: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
aab0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
aac0: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
aad0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
aae0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
aaf0: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
ab00: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
ab10: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
ab20: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
ab30: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
ab40: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
ab50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
ab60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ab70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ab80: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
ab90: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
aba0: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
abb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
abc0: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
abd0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
abe0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
abf0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ac00: 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73  eSize );.  if( s
ac10: 69 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34  ize<4 ) size = 4
ac20: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ac30: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
ac40: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
ac50: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
ac60: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
ac70: 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c  n the SECURE_DEL
ac80: 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  ETE .  ** option
ac90: 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63   is enabled at c
aca0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20  ompile-time */. 
acb0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74   memset(&data[st
acc0: 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a  art], 0, size);.
acd0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
ace0: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
acf0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
ad00: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
ad10: 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  ks */.  hdr = pP
ad20: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ad30: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
ad40: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
ad50: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
ad60: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
ad70: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
ad80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
ad90: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
ada0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
adb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
adc0: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
add0: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
ade0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
adf0: 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  gin<=pPage->pBt-
ae00: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
ae10: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
ae20: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
ae30: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
ae40: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
ae50: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
ae60: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
ae70: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
ae80: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
ae90: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
aea0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a  ge->nFree += siz
aeb0: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
aec0: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
aed0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
aee0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
aef0: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
af00: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
af10: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
af20: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
af30: 70 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20  pnext, psize;.  
af40: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
af50: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
af60: 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61  ert( pbegin<=pPa
af70: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
af80: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
af90: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
afa0: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
afb0: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
afc0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
afd0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
afe0: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
aff0: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
b000: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
b010: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
b020: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
b030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72        assert( fr
b040: 61 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e  ag<=data[pPage->
b050: 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a  hdrOffset+7] );.
b060: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
b070: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
b080: 3d 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75  = frag;.      pu
b090: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b0a0: 67 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26  gin], get2byte(&
b0b0: 64 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20  data[pnext]));. 
b0c0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
b0d0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70  ata[pbegin+2], p
b0e0: 6e 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64  next+get2byte(&d
b0f0: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62  ata[pnext+2])-pb
b100: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  egin);.    }else
b110: 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  {.      addr = p
b120: 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begin;.    }.  }
b130: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65  ..  /* If the ce
b140: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b150: 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72  begins with a fr
b160: 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20  eeblock, remove 
b170: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74  it. */.  if( dat
b180: 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68  a[hdr+1]==data[h
b190: 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64  dr+5] && data[hd
b1a0: 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36  r+2]==data[hdr+6
b1b0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70  ] ){.    int top
b1c0: 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67  ;.    pbegin = g
b1d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b1e0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+1]);.    memcp
b1f0: 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  y(&data[hdr+1], 
b200: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32  &data[pbegin], 2
b210: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
b220: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b230: 35 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  5]);.    put2byt
b240: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b250: 74 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26  top + get2byte(&
b260: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29  data[pbegin+2]))
b270: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
b280: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
b290: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
b2a0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
b2b0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
b2c0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
b2d0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
b2e0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
b2f0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
b300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63  .static void dec
b310: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
b320: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
b330: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
b340: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
b350: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
b360: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
b370: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
b380: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
b390: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
b3a0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  );.  pPage->intK
b3b0: 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26  ey = (flagByte &
b3c0: 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46   (PTF_INTKEY|PTF
b3d0: 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a  _LEAFDATA))!=0;.
b3e0: 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74    pPage->zeroDat
b3f0: 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  a = (flagByte & 
b400: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30  PTF_ZERODATA)!=0
b410: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
b420: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
b430: 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50  F_LEAF)!=0;.  pP
b440: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
b450: 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65  e = 4*(pPage->le
b460: 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20  af==0);.  pBt = 
b470: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
b480: 28 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46  ( flagByte & PTF
b490: 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20  _LEAFDATA ){.   
b4a0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
b4b0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
b4c0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
b4d0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
b4e0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b4f0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
b500: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
b510: 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a  ->leafData = 0;.
b520: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b530: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
b540: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
b550: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b560: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
b570: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b580: 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61   !(pPage->zeroDa
b590: 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c  ta || (!pPage->l
b5a0: 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65  eaf && pPage->le
b5b0: 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a  afData));.}../*.
b5c0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b5d0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
b5e0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
b5f0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
b600: 54 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  The pParent para
b610: 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20  meter must be a 
b620: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
b630: 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20  emPage which.** 
b640: 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  is the parent of
b650: 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
b660: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
b670: 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42  e root of a.** B
b680: 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65  Tree has no pare
b690: 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68  nt and so for th
b6a0: 61 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74  at page, pParent
b6b0: 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ==NULL..**.** Re
b6c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
b6d0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
b6e0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
b6f0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
b700: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
b710: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
b720: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
b730: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
b740: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
b750: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b760: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
b770: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
b780: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
b790: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
b7a0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
b7b0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
b7c0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
b7d0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
b7e0: 6e 74 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d  nt initPage(.  M
b7f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
b800: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
b810: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
b820: 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  zed */.  MemPage
b830: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20   *pParent       
b840: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20  /* The parent.  
b850: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
b860: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  .){.  int pc;   
b870: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
b880: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
b890: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
b8a0: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  >aData[] */.  in
b8b0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
b8c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
b8d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
b8e0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
b8f0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
b900: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
b910: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
b920: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
b930: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
b940: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
b950: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
b960: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
b970: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
b980: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
b990: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b9a0: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
b9b0: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
b9c0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
b9d0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
b9e0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b9f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
ba00: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
ba10: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
ba20: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
ba30: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
ba40: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ba50: 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20   area */..  pBt 
ba60: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
ba70: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
ba80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
ba90: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
baa0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
bab0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
bac0: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
bad0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
bae0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
baf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
bb00: 3e 61 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73  >aData == &((uns
bb10: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67  igned char*)pPag
bb20: 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e)[-pBt->pageSiz
bb30: 65 5d 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  e] );.  if( pPag
bb40: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72  e->pParent!=pPar
bb50: 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70  ent && (pPage->p
bb60: 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61  Parent!=0 || pPa
bb70: 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20  ge->isInit) ){. 
bb80: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
bb90: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76   page should nev
bba0: 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73  er change unless
bbb0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
bbc0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
bbd0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bbe0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
bbf0: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
bc00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
bc10: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  OK;.  if( pPage-
bc20: 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70  >pParent==0 && p
bc30: 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20  Parent!=0 ){.   
bc40: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
bc50: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  = pParent;.    s
bc60: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
bc70: 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
bc80: 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
bc90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bca0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
bcb0: 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46  aData;.  decodeF
bcc0: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
bcd0: 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d  [hdr]);.  pPage-
bce0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
bcf0: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
bd00: 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  t = 0;.  usableS
bd10: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
bd20: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
bd30: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
bd40: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
bd50: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
bd60: 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  af;.  top = get2
bd70: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
bd80: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  ]);.  pPage->nCe
bd90: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
bda0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69  ata[hdr+3]);.  i
bdb0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
bdc0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
bdd0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
bde0: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
bdf0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
be00: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
be10: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
be20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
be30: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
be40: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Page->nCell==0 &
be50: 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20  & pParent!=0 && 
be60: 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
be70: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70   ){.    /* All p
be80: 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61  ages must have a
be90: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
bea0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f  , except for roo
beb0: 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  t pages */.    r
bec0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bed0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
bee0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
bef0: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
bf00: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
bf10: 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
bf20: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
bf30: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
bf40: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
bf50: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
bf60: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77  age->nCell);.  w
bf70: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
bf80: 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65    int next, size
bf90: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61  ;.    if( pc>usa
bfa0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
bfb0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
bfc0: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
bfd0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
bfe0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bff0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c000: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
c010: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
c020: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
c030: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
c040: 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26     if( next>0 &&
c050: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c060: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
c070: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c080: 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
c090: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
c0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c0b0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
c0c0: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a      nFree += siz
c0d0: 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74  e;.    pc = next
c0e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
c0f0: 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20  Free = nFree;.  
c100: 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c  if( nFree>=usabl
c110: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eSize ){.    /* 
c120: 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f  Free space canno
c130: 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70  t exceed total p
c140: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
c150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c160: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
c170: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
c180: 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
c190: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c1a0: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
c1b0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
c1c0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
c1d0: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
c1e0: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
c1f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c200: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
c210: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
c220: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
c230: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
c240: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c250: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c260: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
c270: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
c280: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
c290: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
c2a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
c2b0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
c2c0: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
c2d0: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
c2e0: 28 20 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67  ( &data[pBt->pag
c2f0: 65 53 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67  eSize] == (unsig
c300: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
c310: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c320: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
c330: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
c340: 61 67 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  age) );.  memset
c350: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c360: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c370: 2d 20 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68  - hdr);.  data[h
c380: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
c390: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
c3a0: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
c3b0: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
c3c0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
c3d0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
c3e0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
c3f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c400: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
c410: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
c420: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
c430: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
c440: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
c450: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
c460: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c470: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
c480: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
c490: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
c4a0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50  erflow = 0;.  pP
c4b0: 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
c4c0: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0;.  pPage->nCel
c4d0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
c4e0: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  isInit = 1;.}../
c4f0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
c500: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
c510: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c520: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
c530: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
c540: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
c550: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
c560: 6e 74 20 67 65 74 50 61 67 65 28 42 74 53 68 61  nt getPage(BtSha
c570: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
c580: 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70  gno, MemPage **p
c590: 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c  pPage, int clrFl
c5a0: 61 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ag){.  int rc;. 
c5b0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
c5c0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
c5d0: 67 65 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ge;..  rc = sqli
c5e0: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
c5f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
c600: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
c610: 62 50 61 67 65 2c 20 63 6c 72 46 6c 61 67 29 3b  bPage, clrFlag);
c620: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
c630: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d  rn rc;.  pPage =
c640: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
c650: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
c660: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
c670: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
c680: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
c690: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
c6a0: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
c6b0: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
c6c0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
c6d0: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
c6e0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
c6f0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
c700: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
c710: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
c720: 3b 0a 20 20 69 66 28 20 63 6c 72 46 6c 61 67 20  ;.  if( clrFlag 
c730: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
c740: 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
c750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
c760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
c770: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c780: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c790: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
c7a0: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
c7b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
c7c0: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
c7d0: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
c7e0: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
c7f0: 6c 6c 73 20 74 6f 0a 2a 2a 20 67 65 74 50 61 67  lls to.** getPag
c800: 65 28 29 20 61 6e 64 20 69 6e 69 74 50 61 67 65  e() and initPage
c810: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
c820: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
c830: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
c840: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
c850: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c860: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
c870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c880: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
c890: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
c8a0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
c8b0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
c8c0: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
c8d0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
c8e0: 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61  Parent     /* Pa
c8f0: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
c900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
c910: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
c920: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c930: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c940: 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  ; .  }.  rc = ge
c950: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
c960: 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   ppPage, 0);.  i
c970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c980: 20 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   && (*ppPage)->i
c990: 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
c9a0: 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 2a 70  rc = initPage(*p
c9b0: 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
c9c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c9d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
c9e0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
c9f0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
ca00: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
ca10: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
ca20: 20 74 6f 20 67 65 74 50 61 67 65 2e 0a 2a 2f 0a   to getPage..*/.
ca30: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
ca40: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
ca50: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
ca60: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
ca70: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
ca80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ca90: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
caa0: 20 20 61 73 73 65 72 74 28 20 26 70 50 61 67 65    assert( &pPage
cab0: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70  ->aData[pPage->p
cac0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28  Bt->pageSize]==(
cad0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
cae0: 50 61 67 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  Page );.    sqli
caf0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
cb00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
cb10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
cb20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
cb30: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
cb40: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
cb50: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
cb60: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
cb70: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
cb80: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
cb90: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
cba0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
cbb0: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
cbc0: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  r(DbPage *pData,
cbd0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
cbe0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
cbf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
cc00: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
cc10: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
cc20: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
cc30: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
cc40: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
cc50: 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d  pParent ){.    M
cc60: 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
cc70: 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
cc80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61  ;.    pPage->pPa
cc90: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  rent = 0;.    re
cca0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
ccb0: 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  t);.  }.  pPage-
ccc0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a  >isInit = 0;.}..
ccd0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
cce0: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
ccf0: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
cd00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
cd10: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
cd20: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
cd30: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
cd40: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
cd50: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
cd60: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
cd70: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
cd80: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
cd90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
cda0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
cdb0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
cdc0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
cdd0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
cde0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
cdf0: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
ce00: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
ce10: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
ce20: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
ce30: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
ce40: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
ce50: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
ce60: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61  e;.  assert( (pa
ce70: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
ce80: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
ce90: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
cea0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
ceb0: 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  a);.  if( pPage-
cec0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 70  >isInit ){.    p
ced0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
cee0: 3b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28 70  ;.    initPage(p
cef0: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
cf00: 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rent);.  }.}../*
cf10: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
cf20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
cf30: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
cf40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
cf50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
cf60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
cf70: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
cf80: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
cf90: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
cfa0: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
cfb0: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
cfc0: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
cfd0: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
cfe0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
cff0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  () is called..*/
d000: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
d010: 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  eOpen(.  const c
d020: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
d030: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
d040: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
d050: 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
d060: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
d070: 2a 70 53 71 6c 69 74 65 2c 20 20 20 20 20 20 20  *pSqlite,       
d080: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
d090: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
d0a0: 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
d0b0: 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
d0c0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
d0d0: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
d0e0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
d0f0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
d100: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
d110: 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
d120: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 2f  *pBt;          /
d130: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
d140: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
d150: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d170: 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
d180: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20  n */.  int rc;. 
d190: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20   int nReserve;. 
d1a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
d1b0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23  DbHeader[100];.#
d1c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d1d0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
d1e0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
d1f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
d200: 53 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68  SKIO).  const Th
d210: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f  readData *pTsdro
d220: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
d230: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
d240: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
d250: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
d260: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
d270: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
d280: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
d290: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
d2a0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
d2b0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
d2c0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
d2d0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
d2e0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
d2f0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
d300: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
d310: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
d320: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
d330: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
d340: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d350: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
d360: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
d370: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
d380: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
d390: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
d3a0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
d3b0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
d3c0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
d3d0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
d3e0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
d3f0: 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c  endif..  p = sql
d400: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
d410: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
d420: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
d430: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d440: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
d450: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
d460: 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71  p->pSqlite = pSq
d470: 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  lite;..  /* Try 
d480: 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  to find an exist
d490: 69 6e 67 20 42 74 72 65 65 20 73 74 72 75 63 74  ing Btree struct
d4a0: 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a 46  ure opened on zF
d4b0: 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66 20  ilename. */.#if 
d4c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d4d0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d4e0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
d4f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
d500: 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d 20 73 71  O).  pTsdro = sq
d510: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
d520: 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28  eadOnly();.  if(
d530: 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72   pTsdro->useShar
d540: 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e  edData && zFilen
d550: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
d560: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 75  ){.    char *zFu
d570: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
d580: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
d590: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
d5a0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
d5b0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  hname ){.      s
d5c0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
d5d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d5e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
d5f0: 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64 72     for(pBt=pTsdr
d600: 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20  o->pBtree; pBt; 
d610: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
d620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d630: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
d640: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
d650: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
d660: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
d670: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
d680: 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  r)) ){.        p
d690: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
d6a0: 20 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20       *ppBtree = 
d6b0: 70 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  p;.        pBt->
d6c0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
d6d0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
d6e0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
d6f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d700: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
d710: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
d720: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
d730: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d740: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  /*.  ** The foll
d750: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
d760: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
d770: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
d780: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
d790: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
d7a0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
d7b0: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
d7c0: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
d7d0: 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20  esult.  ** when 
d7e0: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
d7f0: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
d800: 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  cture..  */.  as
d810: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
d820: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
d830: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65  64)==4 );.  asse
d840: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
d850: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
d860: 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  )==4 );.  assert
d870: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
d880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
d890: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
d8a0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
d8b0: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20  (Pgno)==4 );..  
d8c0: 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pBt = sqliteMall
d8d0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  oc( sizeof(*pBt)
d8e0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d 30   );.  if( pBt==0
d8f0: 20 29 7b 0a 20 20 20 20 2a 70 70 42 74 72 65 65   ){.    *ppBtree
d900: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
d910: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  Free(p);.    ret
d920: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d930: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
d940: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 26 70  ite3PagerOpen(&p
d950: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
d960: 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a  ename, EXTRA_SIZ
d970: 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  E, flags);.  if(
d980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d990: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
d9a0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
d9b0: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
d9c0: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
d9d0: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
d9e0: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
d9f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
da00: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  f( pBt->pPager )
da10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
da20: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
da30: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
da40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
da50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
da60: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
da70: 65 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ee = 0;.    retu
da80: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rn rc;.  }.  p->
da90: 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71  pBt = pBt;..  sq
daa0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73  lite3PagerSetDes
dab0: 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61  tructor(pBt->pPa
dac0: 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75 63  ger, pageDestruc
dad0: 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tor);.  sqlite3P
dae0: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
daf0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
db00: 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d  eReinit);.  pBt-
db10: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
db20: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
db30: 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  .  pBt->readOnly
db40: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49   = sqlite3PagerI
db50: 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
db60: 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70  Pager);.  pBt->p
db70: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
db80: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
db90: 5d 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  ]);.  if( pBt->p
dba0: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
dbb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
dbc0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
dbd0: 45 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42  E.       || ((pB
dbe0: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
dbf0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
dc00: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   ){.    pBt->pag
dc10: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
dc20: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
dc30: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  ;.    pBt->maxEm
dc40: 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20 20 20  bedFrac = 64;   
dc50: 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20 70 42  /* 25% */.    pB
dc60: 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20  t->minEmbedFrac 
dc70: 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25  = 32;   /* 12.5%
dc80: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e   */.    pBt->min
dc90: 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20  LeafFrac = 32;  
dca0: 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69    /* 12.5% */.#i
dcb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dcc0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
dcd0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
dce0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
dcf0: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
dd00: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dd10: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  se, then.    ** 
dd20: 64 6f 20 6e 6f 74 20 73 65 74 20 74 68 65 20 61  do not set the a
dd30: 75 74 6f 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c  uto-vacuum flag,
dd40: 20 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f   even if SQLITE_
dd50: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
dd60: 55 4d 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75  UM.    ** is tru
dd70: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
dd80: 68 61 6e 64 2c 20 69 66 20 53 51 4c 49 54 45 5f  hand, if SQLITE_
dd90: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
dda0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a  s been defined,.
ddb0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65      ** then ":me
ddc0: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
ddd0: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
dde0: 6d 65 2e 20 52 65 73 70 65 63 74 20 74 68 65 20  me. Respect the 
ddf0: 61 75 74 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20  auto-vacuum.    
de00: 2a 2a 20 64 65 66 61 75 6c 74 20 69 6e 20 74 68  ** default in th
de10: 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  is case..    */.
de20: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
de30: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
de40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
de50: 56 61 63 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f  Vacuum = SQLITE_
de60: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
de70: 55 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  UM;.    }.#endif
de80: 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
de90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
dea0: 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
deb0: 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42  ader[20];.    pB
dec0: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
ded0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d 3b  = zDbHeader[21];
dee0: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
def0: 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  edFrac = zDbHead
df00: 65 72 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d  er[22];.    pBt-
df10: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a  >minLeafFrac = z
df20: 44 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20  DbHeader[23];.  
df30: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
df40: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
df50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
df60: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
df70: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
df80: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
df90: 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
dfa0: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
dfb0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
dfc0: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
dfd0: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
dfe0: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
dff0: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
e000: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
e010: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
e020: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  ze */.  sqlite3P
e030: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
e040: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
e050: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69  ->pageSize);..#i
e060: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e070: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e080: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
e090: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
e0a0: 4b 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20 74 68  KIO).  /* Add th
e0b0: 65 20 6e 65 77 20 62 74 72 65 65 20 74 6f 20 74  e new btree to t
e0c0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
e0d0: 74 61 72 74 69 6e 67 20 61 74 20 54 68 72 65 61  tarting at Threa
e0e0: 64 44 61 74 61 2e 70 42 74 72 65 65 2e 0a 20 20  dData.pBtree..  
e0f0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 63  ** There is no c
e100: 68 61 6e 63 65 20 74 68 61 74 20 61 20 6d 61 6c  hance that a mal
e110: 6c 6f 63 28 29 20 6d 61 79 20 66 61 69 6c 20 69  loc() may fail i
e120: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 0a 20 20  nside of the .  
e130: 2a 2a 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  ** sqlite3Thread
e140: 44 61 74 61 28 29 20 63 61 6c 6c 2c 20 61 73 20  Data() call, as 
e150: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 73  the ThreadData s
e160: 74 72 75 63 74 75 72 65 20 6d 75 73 74 20 68 61  tructure must ha
e170: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
e180: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66  been allocated f
e190: 6f 72 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68  or pTsdro->useSh
e1a0: 61 72 65 64 44 61 74 61 20 74 6f 20 62 65 20 6e  aredData to be n
e1b0: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  on-zero..  */.  
e1c0: 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53  if( pTsdro->useS
e1d0: 68 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69  haredData && zFi
e1e0: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
e1f0: 64 62 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  db ){.    pBt->p
e200: 4e 65 78 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70  Next = pTsdro->p
e210: 42 74 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74  Btree;.    sqlit
e220: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e  e3ThreadData()->
e230: 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a 20 20  pBtree = pBt;.  
e240: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  }.#endif.  pBt->
e250: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42  nRef = 1;.  *ppB
e260: 74 72 65 65 20 3d 20 70 3b 0a 20 20 72 65 74 75  tree = p;.  retu
e270: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e280: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
e290: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
e2a0: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
e2b0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
e2c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
e2d0: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
e2e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e2f0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
e300: 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64  or *pCur;..#ifnd
e310: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e320: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68  HARED_CACHE.  Th
e330: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a  readData *pTsd;.
e340: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f  #endif..  /* Clo
e350: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
e360: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
e370: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75  andle.  */.  pCu
e380: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
e390: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
e3a0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
e3b0: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
e3c0: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
e3d0: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
e3e0: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
e3f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e400: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
e410: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
e420: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
e430: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
e440: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
e450: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
e460: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
e470: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
e480: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
e490: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
e4a0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
e4b0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
e4c0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
e4d0: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
e4e0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23  qliteFree(p);..#
e4f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e500: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
e510: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e520: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
e530: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
e540: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
e550: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
e560: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
e570: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
e580: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
e590: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
e5a0: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
e5b0: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
e5c0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
e5d0: 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  0 );.  pBt->nRef
e5e0: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
e5f0: 52 65 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Ref ){.    retur
e600: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e610: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
e620: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 66  e shared-btree f
e630: 72 6f 6d 20 74 68 65 20 74 68 72 65 61 64 20 77  rom the thread w
e640: 69 64 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a  ide list. Call .
e650: 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52    ** ThreadDataR
e660: 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68  eadOnly() and th
e670: 65 6e 20 63 61 73 74 20 61 77 61 79 20 74 68 65  en cast away the
e680: 20 63 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20   const property 
e690: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69  of the .  ** poi
e6a0: 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c  nter to avoid al
e6b0: 6c 6f 63 61 74 69 6e 67 20 74 68 72 65 61 64 20  locating thread 
e6c0: 64 61 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f  data if it is no
e6d0: 74 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  t really require
e6e0: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d  d..  */.  pTsd =
e6f0: 20 28 54 68 72 65 61 64 44 61 74 61 20 2a 29 73   (ThreadData *)s
e700: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
e710: 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
e720: 28 20 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d  ( pTsd->pBtree==
e730: 70 42 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pBt ){.    asser
e740: 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33  t( pTsd==sqlite3
e750: 54 68 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a  ThreadData() );.
e760: 20 20 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65      pTsd->pBtree
e770: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
e780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68   }else{.    BtSh
e790: 61 72 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20  ared *pPrev;.   
e7a0: 20 66 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d   for(pPrev=pTsd-
e7b0: 3e 70 42 74 72 65 65 3b 20 70 50 72 65 76 20 26  >pBtree; pPrev &
e7c0: 26 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d  & pPrev->pNext!=
e7d0: 70 42 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76  pBt; pPrev=pPrev
e7e0: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69  ->pNext){}.    i
e7f0: 66 28 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20  f( pPrev ){.    
e800: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d    assert( pTsd==
e810: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e820: 61 28 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72  a() );.      pPr
e830: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ev->pNext = pBt-
e840: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
e850: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
e860: 6c 6f 73 65 20 74 68 65 20 70 61 67 65 72 20 61  lose the pager a
e870: 6e 64 20 66 72 65 65 20 74 68 65 20 73 68 61 72  nd free the shar
e880: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
e890: 72 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  re */.  assert( 
e8a0: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
e8b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  .  sqlite3PagerC
e8c0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
e8d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46  );.  if( pBt->xF
e8e0: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
e8f0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
e900: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
e910: 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
e920: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
e930: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
e940: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42  .  sqliteFree(pB
e950: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
e960: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e970: 20 43 68 61 6e 67 65 20 74 68 65 20 62 75 73 79   Change the busy
e980: 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63   handler callbac
e990: 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  k function..*/.i
e9a0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
e9b0: 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74  etBusyHandler(Bt
e9c0: 72 65 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64  ree *p, BusyHand
e9d0: 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a  ler *pHandler){.
e9e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e9f0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d  = p->pBt;.  pBt-
ea00: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
ea10: 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69  pHandler;.  sqli
ea20: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
ea30: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
ea40: 65 72 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20  er, pHandler);. 
ea50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ea60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
ea70: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
ea80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ea90: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
eaa0: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
eab0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
eac0: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
ead0: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
eae0: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
eaf0: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
eb00: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
eb10: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
eb20: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
eb30: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
eb40: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
eb50: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
eb60: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
eb70: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
eb80: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
eb90: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
eba0: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
ebb0: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
ebc0: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
ebd0: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
ebe0: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
ebf0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
ec00: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
ec10: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
ec20: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
ec30: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
ec40: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
ec50: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
ec60: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
ec70: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
ec80: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
ec90: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
eca0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
ecb0: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
ecc0: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
ecd0: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
ece0: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
ecf0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
ed00: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
ed10: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
ed20: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ed30: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
ed40: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
ed50: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
ed60: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
ed70: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
ed80: 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
ed90: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
eda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
edb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
edc0: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
edd0: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
ede0: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
edf0: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
ee00: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
ee10: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
ee20: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
ee30: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
ee40: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
ee50: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
ee60: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
ee70: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
ee80: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
ee90: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
eea0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
eeb0: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
eec0: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
eed0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
eee0: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
eef0: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
ef00: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
ef10: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
ef20: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
ef30: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
ef40: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
ef50: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
ef60: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
ef70: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
ef80: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
ef90: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
efa0: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
efb0: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
efc0: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
efd0: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
efe0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
eff0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
f000: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
f010: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
f020: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
f030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f040: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
f050: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
f060: 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
f070: 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
f080: 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
f090: 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
f0a0: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
f0b0: 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
f0c0: 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
f0d0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
f0e0: 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
f0f0: 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
f100: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f110: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
f120: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
f130: 61 67 65 72 20 29 3b 0a 20 20 72 65 74 75 72 6e  ager );.  return
f140: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
f150: 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
f160: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
f170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
f180: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
f190: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f1a0: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
f1b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
f1c0: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
f1d0: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
f1e0: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
f1f0: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
f200: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
f210: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
f220: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
f230: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
f240: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
f250: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
f260: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
f270: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
f280: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
f290: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
f2a0: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
f2b0: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
f2c0: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
f2d0: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
f2e0: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
f2f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
f300: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
f310: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
f320: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
f330: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
f340: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
f350: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
f360: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
f370: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
f380: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
f390: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
f3a0: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
f3b0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
f3c0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
f3d0: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
f3e0: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
f3f0: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
f400: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
f410: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
f420: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
f430: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
f440: 76 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ve){.  BtShared 
f450: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
f460: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f470: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72  zeFixed ){.    r
f480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
f490: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
f4a0: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
f4b0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
f4c0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
f4d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
f4e0: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
f4f0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
f500: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
f510: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
f520: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
f530: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
f540: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
f550: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
f560: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
f570: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
f580: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
f590: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f5a0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
f5b0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
f5c0: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a  >pPager, pageSiz
f5d0: 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  e);.  }.  pBt->u
f5e0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
f5f0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
f600: 65 72 76 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  erve;.  return S
f610: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f620: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
f630: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
f640: 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
f650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f660: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
f670: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
f680: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
f690: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f6a0: 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
f6b0: 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
f6c0: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
f6d0: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
f6e0: 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  eSize;.}.#endif 
f6f0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
f700: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
f710: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
f720: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
f730: 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
f740: 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
f750: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
f760: 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
f770: 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
f780: 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
f790: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
f7a0: 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
f7b0: 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
f7c0: 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
f7d0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
f7e0: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
f7f0: 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
f800: 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
f810: 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
f820: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
f830: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
f840: 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
f850: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
f860: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
f870: 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
f880: 75 6d 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  um){.  BtShared 
f890: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 3b 0a  *pBt = p->pBt;;.
f8a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f8b0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f8c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
f8d0: 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
f8e0: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
f8f0: 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65  eFixed ){.    re
f900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
f910: 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  ONLY;.  }.  pBt-
f920: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 61  >autoVacuum = (a
f930: 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a  utoVacuum?1:0);.
f940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f950: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  OK;.#endif.}../*
f960: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
f970: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
f980: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
f990: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
f9a0: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
f9b0: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
f9c0: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
f9d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f9e0: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
f9f0: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
fa00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fa10: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
fa20: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
fa30: 72 6e 20 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  rn p->pBt->autoV
fa40: 61 63 75 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d 0a  acuum;.#endif.}.
fa50: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
fa60: 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
fa70: 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
fa80: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
fa90: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
faa0: 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
fab0: 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
fac0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
fad0: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
fae0: 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
faf0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
fb00: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
fb10: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
fb20: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
fb30: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
fb40: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
fb50: 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
fb60: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
fb70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
fb80: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
fb90: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
fba0: 6f 72 79 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f  ory.  SQLITE_PRO
fbb0: 54 4f 43 4f 4c 20 69 73 20 72 65 74 75 72 6e 65  TOCOL is returne
fbc0: 64 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  d.** if there is
fbd0: 20 61 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f   a locking proto
fbe0: 63 6f 6c 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a  col violation..*
fbf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
fc00: 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
fc10: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c  *pBt){.  int rc,
fc20: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d   pageSize;.  Mem
fc30: 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
fc40: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
fc50: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fc60: 4f 4b 3b 0a 20 20 72 63 20 3d 20 67 65 74 50 61  OK;.  rc = getPa
fc70: 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
fc80: 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
fc90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
fca0: 74 75 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f  turn rc;.  ..  /
fcb0: 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
fcc0: 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
fcd0: 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
fce0: 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
fcf0: 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
fd00: 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
fd10: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
fd20: 4f 54 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c  OTADB;.  if( sql
fd30: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
fd40: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
fd50: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 61 67  0 ){.    u8 *pag
fd60: 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
fd70: 74 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  ta;.    if( memc
fd80: 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
fd90: 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
fda0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
fdb0: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
fdc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
fdd0: 67 65 31 5b 31 38 5d 3e 31 20 7c 7c 20 70 61 67  ge1[18]>1 || pag
fde0: 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
fdf0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
fe00: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
fe10: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
fe20: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
fe30: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
fe40: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
fe50: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
fe60: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
fe70: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
fe80: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
fe90: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
fea0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
feb0: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
fec0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
fed0: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
fee0: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
fef0: 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
ff00: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
ff10: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
ff20: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
ff30: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
ff40: 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
ff50: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
ff60: 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
ff70: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
ff80: 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
ff90: 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
ffa0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
ffb0: 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
ffc0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
ffd0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
ffe0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  4*4])?1:0);.#end
fff0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
10000 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
10010 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
10020 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
10030 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
10040 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
10050 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
10060 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
10070 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
10080 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
10090 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
100a0 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
100b0 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
100c0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
100d0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
100e0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
100f0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
10100 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
10110 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
10120 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
10130 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
10140 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
10150 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
10160 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
10170 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10180 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
10190 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
101a0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
101b0 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
101c0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
101d0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
101e0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
101f0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
10200 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
10210 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
10220 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
10230 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
10240 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
10250 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
10260 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
10270 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32 35  >maxEmbedFrac/25
10280 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
10290 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
102a0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
102b0 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
102c0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
102d0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
102e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
102f0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
10300 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
10310 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
10320 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20 32  LeafFrac/255 - 2
10330 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
10340 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
10350 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
10360 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
10370 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
10380 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
10390 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
103a0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
103b0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
103c0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
103d0 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
103e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
103f0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
10400 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
10410 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
10420 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
10430 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10440 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
10450 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
10460 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
10470 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
10480 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
10490 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
104a0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
104b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
104c0 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
104d0 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
104e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
104f0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52 65 66  E_OK;.  if( pRef
10500 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
10510 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
10520 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10530 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
10540 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
10550 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
10560 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
10570 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
10580 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
10590 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
105a0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
105b0 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
105c0 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
105d0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
105e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
105f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
10600 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
10610 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
10620 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
10630 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
10640 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
10650 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
10660 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
10670 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
10680 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
10690 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
106a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
106b0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
106c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
106d0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
106e0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
106f0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
10700 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10710 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
10720 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
10730 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
10740 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
10750 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
10760 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
10770 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
10780 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
10790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
107a0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
107b0 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
107c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
107d0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
107e0 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
107f0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
10800 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
10810 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10820 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
10830 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
10840 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
10850 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
10860 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
10870 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10880 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=1 ){.      if(
10890 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
108a0 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
108b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
108c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
108d0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61          pPage->a
108e0 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70 50  Data = &((u8*)pP
108f0 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  age)[-pBt->pageS
10900 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50  ize];.        pP
10910 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10920 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
10930 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  gno = 1;.      }
10940 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10950 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
10960 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
10970 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
10980 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
10990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
109a0 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62  eate a new datab
109b0 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
109c0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
109d0 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ge of the.** fil
109e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
109f0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
10a00 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10a10 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
10a20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
10a30 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ta;.  int rc;.  
10a40 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
10a50 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
10a60 50 61 67 65 72 29 3e 30 20 29 20 72 65 74 75 72  Pager)>0 ) retur
10a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
10a80 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
10a90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
10aa0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
10ab0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
10ac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
10ad0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
10ae0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
10af0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
10b00 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
10b10 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
10b20 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
10b30 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
10b40 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
10b50 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
10b60 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61  ata[16], pBt->pa
10b70 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
10b80 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
10b90 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  19] = 1;.  data[
10ba0 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  20] = pBt->pageS
10bb0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
10bc0 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31  eSize;.  data[21
10bd0 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65  ] = pBt->maxEmbe
10be0 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 32  dFrac;.  data[22
10bf0 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  ] = pBt->minEmbe
10c00 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 33  dFrac;.  data[23
10c10 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ] = pBt->minLeaf
10c20 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Frac;.  memset(&
10c30 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
10c40 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
10c50 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
10c60 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
10c70 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
10c80 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
10c90 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
10ca0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
10cb0 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  UM.  if( pBt->au
10cc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
10cd0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
10ce0 36 20 2b 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20  6 + 4*4], 1);.  
10cf0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
10d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10d10 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
10d20 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
10d30 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
10d40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
10d50 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
10d60 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
10d70 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
10d80 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
10d90 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
10da0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
10db0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
10dc0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
10dd0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
10de0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
10df0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
10e00 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
10e10 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
10e20 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
10e30 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
10e40 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
10e50 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
10e60 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
10e70 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
10e80 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
10e90 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
10ea0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
10eb0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
10ec0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
10ed0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
10ee0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
10ef0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
10f00 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
10f10 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
10f20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
10f30 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
10f40 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
10f50 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
10f60 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
10f70 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
10f80 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
10f90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
10fa0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
10fb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
10fc0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
10fd0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10fe0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
10ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11000 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
11010 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11020 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
11030 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
11040 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
11050 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
11060 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
11070 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
11080 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
11090 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
110a0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
110b0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
110c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
110d0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
110e0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
110f0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
11100 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
11110 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
11120 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
11130 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
11140 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
11150 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
11160 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
11170 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
11180 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
11190 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
111a0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
111b0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
111c0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
111d0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
111e0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
111f0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
11200 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
11210 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
11220 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
11230 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
11240 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
11250 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
11260 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
11270 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
11280 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
11290 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
112a0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
112b0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
112c0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
112d0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
112e0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
112f0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
11300 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
11310 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
11320 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
11330 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
11340 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
11350 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
11360 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
11370 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
11380 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
11390 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
113a0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
113b0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
113c0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
113d0 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68   wrflag){.  BtSh
113e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
113f0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
11400 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72  QLITE_OK;..  btr
11410 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
11420 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
11430 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
11440 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
11450 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
11460 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
11470 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11480 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
11490 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
114a0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
114b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
114c0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
114d0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
114e0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
114f0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
11500 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 72 65  rflag) ){.    re
11510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11520 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
11530 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
11540 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
11550 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
11560 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
11570 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
11580 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrflag ){.    re
11590 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
115a0 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
115b0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
115c0 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
115d0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
115e0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
115f0 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
11600 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
11610 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
11620 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
11630 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
11640 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
11650 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
11660 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
11670 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
11680 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
11690 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
116a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
116b0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
116c0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
116d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
116e0 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
116f0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
11700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11710 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
11720 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11730 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
11740 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
11750 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 69 66  lag>1);.      if
11760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11770 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11780 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
11790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
117a0 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53    .    if( rc==S
117b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
117c0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70    if( wrflag ) p
117d0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
117e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
117f0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
11800 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
11810 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
11820 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
11830 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11840 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
11850 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11860 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
11870 65 72 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e  er(pBt->pBusyHan
11880 64 6c 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  dler) );..  if( 
11890 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
118a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
118b0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
118c0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
118d0 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20  ransaction++;.  
118e0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
118f0 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
11900 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
11910 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
11920 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
11930 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
11940 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
11950 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
11960 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rans;.    }.  }.
11970 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
11980 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  y(p);.  return r
11990 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
119a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
119b0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
119c0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
119d0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
119e0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
119f0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
11a00 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
11a10 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
11a20 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
11a30 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
11a40 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
11a50 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
11a60 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
11a70 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
11a80 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
11a90 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
11aa0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
11ad0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
11ae0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11b10 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
11b20 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
11b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
11b60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11b70 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
11b80 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
11b90 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
11ba0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
11bb0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69  Page->pgno;..  i
11bc0 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
11bd0 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  );.  nCell = pPa
11be0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
11bf0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
11c00 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
11c10 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
11c20 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72  Page, i);..    r
11c30 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
11c40 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
11c50 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
11c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11c70 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
11c80 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
11c90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
11ca0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
11cb0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
11cc0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
11cd0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ell);.      rc =
11ce0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
11cf0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
11d00 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
11d10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11d20 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
11d30 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
11d40 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
11d50 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
11d60 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
11d70 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
11d80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
11d90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
11da0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20  set+8]);.    rc 
11db0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
11dc0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
11dd0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b  AP_BTREE, pgno);
11de0 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
11df0 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
11e00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
11e10 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
11e20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11e30 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
11e40 61 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75  age, which is gu
11e50 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61  arenteed to be a
11e60 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74   btree page, not
11e70 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
11e80 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  page, is a point
11e90 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
11ea0 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f  . Modify this po
11eb0 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  inter so that it
11ec0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54   points to.** iT
11ed0 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
11ee0 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
11ef0 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
11f00 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c   to be modified,
11f10 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a   as .** follows:
11f20 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
11f30 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
11f40 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
11f50 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
11f60 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
11f70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
11f80 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
11f90 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
11fa0 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
11fb0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
11fc0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
11fd0 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
11fe0 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
11ff0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
12000 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
12010 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
12020 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
12030 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
12040 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
12050 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
12060 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
12070 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
12090 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
120a0 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
120b0 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
120c0 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
120d0 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
120e0 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
120f0 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20  8 eType){.  if( 
12100 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12110 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
12120 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
12130 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
12140 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
12150 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
12160 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
12170 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
12180 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
12190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
121a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
121b0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
121c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
121d0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
121e0 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69  e{.    int isIni
121f0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
12200 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
12210 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
12220 0a 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28 70  ..    initPage(p
12230 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43  Page, 0);.    nC
12240 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
12250 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
12260 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
12270 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
12280 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
12290 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
122a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
122b0 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
122c0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
122d0 6f 3b 0a 20 20 20 20 20 20 20 20 70 61 72 73 65  o;.        parse
122e0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
122f0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
12300 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
12310 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
12320 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
12330 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
12340 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
12350 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
12360 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
12370 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
12380 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
12390 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
123a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
123b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
123c0 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
123d0 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
123e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
123f0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
12400 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
12410 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
12420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
12430 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
12440 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
12450 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
12460 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
12470 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
12480 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
12490 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
124a0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
124b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
124c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
124d0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
124e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
124f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
12500 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
12510 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
12520 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
12530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
12550 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
12560 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
12570 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
12580 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
12590 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
125a0 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
125b0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
125c0 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
125d0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
125e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
125f0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
12600 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
12610 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
12620 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
12630 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
12640 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
12650 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12660 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
12670 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
12680 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
12690 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
126a0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
126b0 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
126c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
126d0 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20 20  no iFreePage    
126e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
126f0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
12700 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a  DbPage to */.){.
12710 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
12720 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
12730 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
12740 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
12750 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
12760 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
12770 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
12780 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
12790 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
127a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
127b0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
127c0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
127d0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
127e0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
127f0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
12800 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
12810 4f 4f 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a  OOTPAGE );..  /*
12820 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
12830 67 65 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72  ge from it's cur
12840 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
12850 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
12860 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
12870 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
12880 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
12890 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
128a0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
128b0 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
128c0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
128d0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
128e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
128f0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
12900 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
12910 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
12920 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
12930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12940 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
12950 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
12960 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
12970 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
12980 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
12990 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
129a0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
129b0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
129c0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
129d0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
129e0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
129f0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
12a00 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
12a10 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
12a20 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
12a30 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
12a40 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
12a50 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
12a60 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
12a70 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
12a80 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
12a90 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
12aa0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
12ab0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
12ac0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
12ad0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
12ae0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
12af0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
12b00 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
12b10 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12b20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
12b30 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
12b40 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
12b50 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
12b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
12b80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
12b90 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
12ba0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
12bb0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
12bc0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
12bd0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
12be0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
12bf0 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
12c00 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
12c10 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20   iFreePage);.   
12c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12c40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12c50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12c60 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
12c70 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
12c80 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
12c90 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
12ca0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
12cb0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
12cc0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
12cd0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
12ce0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
12cf0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
12d00 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
12d10 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
12d20 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
12d30 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
12d40 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
12d50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
12d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12d80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12d90 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
12da0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
12db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
12dd0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
12de0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
12df0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
12e00 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
12e10 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
12e20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
12e30 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
12e40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
12e50 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
12e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12e70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
12e80 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
12e90 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
12ea0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
12eb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12ec0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
12ed0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
12ee0 64 20 62 79 20 61 75 74 6f 56 61 63 75 75 6d 43  d by autoVacuumC
12ef0 6f 6d 6d 69 74 28 29 2e 20 2a 2f 0a 73 74 61 74  ommit(). */.stat
12f00 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
12f10 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
12f20 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
12f30 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
12f40 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  8);../*.** This 
12f50 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12f60 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
12f70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
12f80 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
12f90 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
12fa0 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
12fb0 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  um database..*/.
12fc0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
12fd0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
12fe0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
12ff0 2a 6e 54 72 75 6e 63 29 7b 0a 20 20 50 61 67 65  *nTrunc){.  Page
13000 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
13010 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
13020 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
13030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13040 6f 66 20 70 61 67 65 73 20 72 65 6d 61 69 6e 69  of pages remaini
13050 6e 67 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ng on the free-l
13060 69 73 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ist. */.  int nP
13070 74 72 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trMap;          
13080 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13090 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  f pointer-map pa
130a0 67 65 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  ges deallocated 
130b0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 53 69  */.  Pgno origSi
130c0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
130d0 2f 2a 20 50 61 67 65 73 20 69 6e 20 74 68 65 20  /* Pages in the 
130e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
130f0 0a 20 20 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b  .  Pgno finSize;
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13110 20 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   Pages in the da
13120 74 61 62 61 73 65 20 66 69 6c 65 20 61 66 74 65  tabase file afte
13130 72 20 74 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a  r truncation */.
13140 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13160 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
13170 20 75 38 20 65 54 79 70 65 3b 0a 20 20 69 6e 74   u8 eType;.  int
13180 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67   pgsz = pBt->pag
13190 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20  eSize;  /* Page 
131a0 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 64 61  size for this da
131b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f  tabase */.  Pgno
131c0 20 69 44 62 50 61 67 65 3b 20 20 20 20 20 20 20   iDbPage;       
131d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
131e0 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d  tabase page to m
131f0 6f 76 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ove */.  MemPage
13200 20 2a 70 44 62 4d 65 6d 50 61 67 65 20 3d 20 30   *pDbMemPage = 0
13210 3b 20 20 20 2f 2a 20 22 22 20 2a 2f 0a 20 20 50  ;   /* "" */.  P
13220 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 20 20 20  gno iPtrPage;   
13230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13240 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
13250 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
13260 20 69 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   iDbPage */.  Pg
13270 6e 6f 20 69 46 72 65 65 50 61 67 65 3b 20 20 20  no iFreePage;   
13280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13290 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 20 74  free-list page t
132a0 6f 20 6d 6f 76 65 20 69 44 62 50 61 67 65 20 74  o move iDbPage t
132b0 6f 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  o */.  MemPage *
132c0 70 46 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30  pFreeMemPage = 0
132d0 3b 20 2f 2a 20 22 22 20 2a 2f 0a 0a 23 69 66 6e  ; /* "" */..#ifn
132e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
132f0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
13300 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
13310 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
13320 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
13330 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
13340 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
13350 42 74 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  Bt, sqlite3Pager
13360 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
13370 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
13380 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13390 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
133a0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
133b0 61 6e 79 20 66 72 65 65 2d 70 61 67 65 73 20 61  any free-pages a
133c0 72 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  re in the databa
133d0 73 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  se. If there are
133e0 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 20 70 61   no.  ** free pa
133f0 67 65 73 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ges, then auto-v
13400 61 63 75 75 6d 20 69 73 20 61 20 6e 6f 2d 6f 70  acuum is a no-op
13410 2e 0a 20 20 2a 2f 0a 20 20 6e 46 72 65 65 4c 69  ..  */.  nFreeLi
13420 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
13430 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
13440 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 46  a[36]);.  if( nF
13450 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
13460 20 20 2a 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20    *nTrunc = 0;. 
13470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13480 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
13490 68 69 73 20 62 6c 6f 63 6b 20 66 69 67 75 72 65  his block figure
134a0 73 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 70  s out how many p
134b0 61 67 65 73 20 74 68 65 72 65 20 61 72 65 20 69  ages there are i
134c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
134d0 20 2a 2a 20 6e 6f 77 20 28 76 61 72 69 61 62 6c   ** now (variabl
134e0 65 20 6f 72 69 67 53 69 7a 65 29 2c 20 61 6e 64  e origSize), and
134f0 20 68 6f 77 20 6d 61 6e 79 20 74 68 65 72 65 20   how many there 
13500 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20 74 68  will be after th
13510 65 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 69 6f  e.  ** truncatio
13520 6e 20 28 76 61 72 69 61 62 6c 65 20 66 69 6e 53  n (variable finS
13530 69 7a 65 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize)..  **.  ** 
13540 54 68 65 20 66 69 6e 61 6c 20 73 69 7a 65 20 69  The final size i
13550 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  s the original s
13560 69 7a 65 2c 20 6c 65 73 73 20 74 68 65 20 6e 75  ize, less the nu
13570 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
13580 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64  es.  ** in the d
13590 61 74 61 62 61 73 65 2c 20 6c 65 73 73 20 61 6e  atabase, less an
135a0 79 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  y pointer-map pa
135b0 67 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  ges that will no
135c0 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 62 65 20   longer.  ** be 
135d0 72 65 71 75 69 72 65 64 2c 20 6c 65 73 73 20 31  required, less 1
135e0 20 69 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   if the pending-
135f0 62 79 74 65 20 70 61 67 65 20 77 61 73 20 70 61  byte page was pa
13600 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  rt of the databa
13610 73 65 0a 20 20 2a 2a 20 62 75 74 20 69 73 20 6e  se.  ** but is n
13620 6f 74 20 61 66 74 65 72 20 74 68 65 20 74 72 75  ot after the tru
13630 6e 63 61 74 69 6f 6e 2e 0a 20 20 2a 2a 2f 0a 20  ncation..  **/. 
13640 20 6f 72 69 67 53 69 7a 65 20 3d 20 73 71 6c 69   origSize = sqli
13650 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
13660 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
13670 20 6f 72 69 67 53 69 7a 65 3d 3d 50 45 4e 44 49   origSize==PENDI
13680 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
13690 29 20 29 7b 0a 20 20 20 20 6f 72 69 67 53 69 7a  ) ){.    origSiz
136a0 65 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 50 74 72 4d  e--;.  }.  nPtrM
136b0 61 70 20 3d 20 28 6e 46 72 65 65 4c 69 73 74 2d  ap = (nFreeList-
136c0 6f 72 69 67 53 69 7a 65 2b 50 54 52 4d 41 50 5f  origSize+PTRMAP_
136d0 50 41 47 45 4e 4f 28 70 42 74 2c 20 6f 72 69 67  PAGENO(pBt, orig
136e0 53 69 7a 65 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Size)+pgsz/5)/(p
136f0 67 73 7a 2f 35 29 3b 0a 20 20 66 69 6e 53 69 7a  gsz/5);.  finSiz
13700 65 20 3d 20 6f 72 69 67 53 69 7a 65 20 2d 20 6e  e = origSize - n
13710 46 72 65 65 4c 69 73 74 20 2d 20 6e 50 74 72 4d  FreeList - nPtrM
13720 61 70 3b 0a 20 20 69 66 28 20 6f 72 69 67 53 69  ap;.  if( origSi
13730 7a 65 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ze>PENDING_BYTE_
13740 50 41 47 45 28 70 42 74 29 20 26 26 20 66 69 6e  PAGE(pBt) && fin
13750 53 69 7a 65 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  Size<=PENDING_BY
13760 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
13770 20 20 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20      finSize--;. 
13780 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
13790 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 66  AP_ISPAGE(pBt, f
137a0 69 6e 53 69 7a 65 29 20 7c 7c 20 66 69 6e 53 69  inSize) || finSi
137b0 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
137c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
137d0 20 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d    finSize--;.  }
137e0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
137f0 41 43 55 55 4d 3a 20 42 65 67 69 6e 20 28 64 62  ACUUM: Begin (db
13800 20 73 69 7a 65 20 25 64 2d 3e 25 64 29 5c 6e 22   size %d->%d)\n"
13810 2c 20 6f 72 69 67 53 69 7a 65 2c 20 66 69 6e 53  , origSize, finS
13820 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  ize));..  /* Var
13830 69 61 62 6c 65 20 27 66 69 6e 53 69 7a 65 27 20  iable 'finSize' 
13840 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65  will be the size
13850 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 20   of the file in 
13860 70 61 67 65 73 20 61 66 74 65 72 0a 20 20 2a 2a  pages after.  **
13870 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
13880 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 20 28   has completed (
13890 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65  the current file
138a0 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 20   size minus the 
138b0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70  number.  ** of p
138c0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
138d0 20 6c 69 73 74 29 2e 20 4c 6f 6f 70 20 74 68 72   list). Loop thr
138e0 6f 75 67 68 20 74 68 65 20 70 61 67 65 73 20 74  ough the pages t
138f0 68 61 74 20 6c 69 65 20 62 65 79 6f 6e 64 0a 20  hat lie beyond. 
13900 20 2a 2a 20 74 68 69 73 20 6d 61 72 6b 2c 20 61   ** this mark, a
13910 6e 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  nd if they are n
13920 6f 74 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  ot already on th
13930 65 20 66 72 65 65 20 6c 69 73 74 2c 20 6d 6f 76  e free list, mov
13940 65 20 74 68 65 6d 0a 20 20 2a 2a 20 74 6f 20 61  e them.  ** to a
13950 20 66 72 65 65 20 70 61 67 65 20 65 61 72 6c 69   free page earli
13960 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  er in the file (
13970 73 6f 6d 65 77 68 65 72 65 20 62 65 66 6f 72 65  somewhere before
13980 20 66 69 6e 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a   finSize)..  */.
13990 20 20 66 6f 72 28 20 69 44 62 50 61 67 65 3d 66    for( iDbPage=f
139a0 69 6e 53 69 7a 65 2b 31 3b 20 69 44 62 50 61 67  inSize+1; iDbPag
139b0 65 3c 3d 6f 72 69 67 53 69 7a 65 3b 20 69 44 62  e<=origSize; iDb
139c0 50 61 67 65 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a  Page++ ){.    /*
139d0 20 49 66 20 69 44 62 50 61 67 65 20 69 73 20 61   If iDbPage is a
139e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
139f0 65 2c 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  e, or the pendin
13a00 67 2d 62 79 74 65 20 70 61 67 65 2c 20 73 6b 69  g-byte page, ski
13a10 70 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  p it. */.    if(
13a20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
13a30 42 74 2c 20 69 44 62 50 61 67 65 29 20 7c 7c 20  Bt, iDbPage) || 
13a40 69 44 62 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  iDbPage==PENDING
13a50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13a60 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
13a70 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  e;.    }..    rc
13a80 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
13a90 2c 20 69 44 62 50 61 67 65 2c 20 26 65 54 79 70  , iDbPage, &eTyp
13aa0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
13ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13ac0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f  E_OK ) goto auto
13ad0 76 61 63 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20  vacuum_out;.    
13ae0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
13af0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
13b00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13b10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
13b20 20 20 20 20 67 6f 74 6f 20 61 75 74 6f 76 61 63      goto autovac
13b30 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  uum_out;.    }..
13b40 20 20 20 20 2f 2a 20 49 66 20 69 44 62 50 61 67      /* If iDbPag
13b50 65 20 69 73 20 66 72 65 65 2c 20 64 6f 20 6e 6f  e is free, do no
13b60 74 20 73 77 61 70 20 69 74 2e 20 20 2a 2f 0a 20  t swap it.  */. 
13b70 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
13b80 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
13b90 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
13ba0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13bb0 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 44 62  getPage(pBt, iDb
13bc0 50 61 67 65 2c 20 26 70 44 62 4d 65 6d 50 61 67  Page, &pDbMemPag
13bd0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
13be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
13bf0 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  oto autovacuum_o
13c00 75 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  ut;..    /* Find
13c10 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
13c20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
13c30 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  that is not alre
13c40 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 0a  ady at the end .
13c50 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
13c60 6c 65 2e 20 41 20 70 61 67 65 20 63 61 6e 20 62  le. A page can b
13c70 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
13c80 20 66 72 65 65 20 6c 69 73 74 20 75 73 69 6e 67   free list using
13c90 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c   the .    ** all
13ca0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
13cb0 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
13cc0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
13cd0 66 28 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20  f( pFreeMemPage 
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
13cf0 73 65 50 61 67 65 28 70 46 72 65 65 4d 65 6d 50  sePage(pFreeMemP
13d00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  age);.        pF
13d10 72 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a  reeMemPage = 0;.
13d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
13d30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
13d40 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
13d50 4d 65 6d 50 61 67 65 2c 20 26 69 46 72 65 65 50  MemPage, &iFreeP
13d60 61 67 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  age, 0, 0);.    
13d70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
13d90 65 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d 65  eleasePage(pDbMe
13da0 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
13db0 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
13dc0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
13dd0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
13de0 50 61 67 65 3c 3d 6f 72 69 67 53 69 7a 65 20 29  Page<=origSize )
13df0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 46  ;.    }while( iF
13e00 72 65 65 50 61 67 65 3e 66 69 6e 53 69 7a 65 20  reePage>finSize 
13e10 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
13e20 67 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65 29  ge(pFreeMemPage)
13e30 3b 0a 20 20 20 20 70 46 72 65 65 4d 65 6d 50 61  ;.    pFreeMemPa
13e40 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
13e50 52 65 6c 6f 63 61 74 65 20 74 68 65 20 70 61 67  Relocate the pag
13e60 65 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  e into the body 
13e70 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 4e 6f 74  of the file. Not
13e80 65 20 74 68 61 74 20 61 6c 74 68 6f 75 67 68 20  e that although 
13e90 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
13ea0 20 68 61 73 20 6d 6f 76 65 64 20 77 69 74 68 69   has moved withi
13eb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13ec0 69 6c 65 2c 20 74 68 65 20 70 44 62 4d 65 6d 50  ile, the pDbMemP
13ed0 61 67 65 20 70 6f 69 6e 74 65 72 20 0a 20 20 20  age pointer .   
13ee0 20 2a 2a 20 72 65 6d 61 69 6e 73 20 76 61 6c 69   ** remains vali
13ef0 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  d. This means th
13f00 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
13f10 20 63 61 6e 20 72 75 6e 20 77 69 74 68 6f 75 74   can run without
13f20 0a 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61  .    ** invalida
13f30 74 69 6e 67 20 63 75 72 73 6f 72 73 20 6f 70 65  ting cursors ope
13f40 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 2e 20  n on the btree. 
13f50 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
13f60 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 73 68 61  t in .    ** sha
13f70 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0a  red-cache mode..
13f80 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
13f90 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
13fa0 2c 20 70 44 62 4d 65 6d 50 61 67 65 2c 20 65 54  , pDbMemPage, eT
13fb0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
13fc0 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 72  FreePage);.    r
13fd0 65 6c 65 61 73 65 50 61 67 65 28 70 44 62 4d 65  eleasePage(pDbMe
13fe0 6d 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  mPage);.    if( 
13ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14000 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
14010 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  out;.  }..  /* T
14020 68 65 20 65 6e 74 69 72 65 20 66 72 65 65 2d 6c  he entire free-l
14030 69 73 74 20 68 61 73 20 62 65 65 6e 20 73 77 61  ist has been swa
14040 70 70 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20  pped to the end 
14050 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a  of the file. So.
14060 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 68    ** truncate th
14070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14080 74 6f 20 66 69 6e 53 69 7a 65 20 70 61 67 65 73  to finSize pages
14090 20 61 6e 64 20 63 6f 6e 73 69 64 65 72 20 74 68   and consider th
140a0 65 0a 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74  e.  ** free-list
140b0 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72   empty..  */.  r
140c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
140d0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
140e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
140f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14100 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75   ) goto autovacu
14110 75 6d 5f 6f 75 74 3b 0a 20 20 70 75 74 34 62 79  um_out;.  put4by
14120 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14130 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
14140 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
14150 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
14160 36 5d 2c 20 30 29 3b 0a 20 20 2a 6e 54 72 75 6e  6], 0);.  *nTrun
14170 63 20 3d 20 66 69 6e 53 69 7a 65 3b 0a 20 20 61  c = finSize;.  a
14180 73 73 65 72 74 28 20 66 69 6e 53 69 7a 65 21 3d  ssert( finSize!=
14190 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
141a0 45 28 70 42 74 29 20 29 3b 0a 0a 61 75 74 6f 76  E(pBt) );..autov
141b0 61 63 75 75 6d 5f 6f 75 74 3a 0a 20 20 61 73 73  acuum_out:.  ass
141c0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
141d0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
141e0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28  pPager) );.  if(
141f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
14210 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
14220 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
14230 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
14240 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
14250 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
14260 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
14270 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
14280 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
14290 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
142a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
142b0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
142c0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
142d0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
142e0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
142f0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
14300 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
14310 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
14320 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14330 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  t;..  btreeInteg
14340 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
14350 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
14360 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
14370 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
14380 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
14390 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
143a0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
143b0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
143c0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
143d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
143e0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
143f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
14400 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14410 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
14420 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
14430 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14440 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
14450 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14460 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 70 42  e3PagerCommit(pB
14470 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
14480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14490 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
144a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
144b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
144c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
144d0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
144e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f   = 0;.  }.  unlo
144f0 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a  ckAllTables(p);.
14500 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
14510 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64  dle has any kind
14520 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
14530 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
14540 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
14550 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68    ** count of th
14560 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
14570 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
14580 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  on count reaches
14590 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65   0, set.  ** the
145a0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
145b0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
145c0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
145d0 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f  used() call belo
145e0 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f  w.  ** will unlo
145f0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  ck the pager..  
14600 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
14610 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
14620 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  ){.    pBt->nTra
14630 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
14640 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
14650 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
14660 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
14670 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
14680 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
14690 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c  /* Set the handl
146a0 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  es current trans
146b0 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
146c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
146d0 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70  nlock.  ** the p
146e0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
146f0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
14700 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
14710 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
14720 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  /.  p->inTrans =
14730 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75   TRANS_NONE;.  u
14740 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14750 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
14760 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
14770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14780 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
14790 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
147a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
147b0 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70  write-cursors op
147c0 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c  en on this handl
147d0 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  e. This is for u
147e0 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
147f0 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
14800 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
14810 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
14820 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
14830 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14840 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
14850 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
14860 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
14870 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
14880 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
14890 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
148a0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
148b0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
148c0 2d 3e 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20  ->wrFlag ) r++; 
148d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
148e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
148f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
14900 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
14910 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
14920 2a 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67 69  ** Print debuggi
14930 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
14940 62 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73  bout all cursors
14950 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
14960 70 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  put..*/.void sql
14970 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c  ite3BtreeCursorL
14980 69 73 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ist(Btree *p){. 
14990 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
149a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
149b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72   = p->pBt;.  for
149c0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
149d0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
149e0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
149f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
14a00 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
14a10 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d     char *zMode =
14a20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20   pCur->wrFlag ? 
14a30 22 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20  "rw" : "ro";.   
14a40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
14a50 6e 74 66 28 22 43 55 52 53 4f 52 20 25 70 20 72  ntf("CURSOR %p r
14a60 6f 6f 74 65 64 20 61 74 20 25 34 64 28 25 73 29  ooted at %4d(%s)
14a70 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25 64   currently at %d
14a80 2e 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  .%d%s\n",.      
14a90 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e   pCur, pCur->pgn
14aa0 6f 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20  oRoot, zMode,.  
14ab0 20 20 20 20 20 70 50 61 67 65 20 3f 20 70 50 61       pPage ? pPa
14ac0 67 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43  ge->pgno : 0, pC
14ad0 75 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20  ur->idx,.       
14ae0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
14af0 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22  URSOR_VALID) ? "
14b00 22 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20 29  " : " eof".    )
14b10 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
14b20 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
14b30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
14b40 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c  n progress.  All
14b50 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
14b60 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79  .** invalided by
14b70 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
14b80 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
14b90 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a   use a cursor.**
14ba0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
14bb0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
14bc0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
14bd0 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  n will result.**
14be0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
14bf0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
14c00 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
14c10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14c20 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
14c30 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
14c40 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
14c50 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
14c60 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
14c70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14c80 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
14c90 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
14ca0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14cb0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
14cc0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
14cd0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
14ce0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
14cf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14d00 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14d10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
14d30 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
14d40 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
14d50 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
14d60 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
14d70 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  lst.    ** tryin
14d80 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72  g to save cursor
14d90 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74   positions. If t
14da0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  his is an automa
14db0 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73  tic rollback (as
14dc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75  .    ** the resu
14dd0 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  lt of a constrai
14de0 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  nt, malloc() fai
14df0 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72  lure or IO error
14e00 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  ) then .    ** t
14e10 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20  he cache may be 
14e20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e  internally incon
14e30 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e  sistent (not con
14e40 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73  tain valid trees
14e50 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63  ) so.    ** we c
14e60 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74  annot simply ret
14e70 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f  urn the error to
14e80 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73   the caller. Ins
14e90 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20  tead, abort .   
14ea0 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20   ** all queries 
14eb0 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e  that may be usin
14ec0 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72  g any of the cur
14ed0 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64  sors that failed
14ee0 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f   to save..    */
14ef0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
14f00 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
14f10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14f20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42  pBt->pCursor->pB
14f30 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20  tree->pSqlite;. 
14f40 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20       if( db ){. 
14f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62         sqlite3Ab
14f60 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64  ortOtherActiveVd
14f70 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  bes(db, 0);.    
14f80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
14f90 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65  ndif.  btreeInte
14fa0 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f  grity(p);.  unlo
14fb0 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a  ckAllTables(p);.
14fc0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
14fd0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
14fe0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
14ff0 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
15000 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
15010 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
15020 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
15030 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
15040 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
15050 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
15060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
15070 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
15080 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
15090 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
150a0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
150b0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
150c0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 67 65 74  .    ** call get
150d0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
150e0 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 20 73   again to make s
150f0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
15100 61 20 69 73 0a 20 20 20 20 2a 2a 20 73 65 74 20  a is.    ** set 
15110 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
15120 20 20 69 66 28 20 67 65 74 50 61 67 65 28 70 42    if( getPage(pB
15130 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
15140 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
15150 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
15160 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
15170 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
15180 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70  ntWriteCursors(p
15190 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42  Bt)==0 );.    pB
151a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
151b0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
151c0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   }..  if( p->inT
151d0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
151e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
151f0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
15200 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  n>0 );.    pBt->
15210 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
15220 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
15230 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
15240 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
15250 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
15260 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
15270 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  ..  p->inTrans =
15280 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
15290 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
152a0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
152b0 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
152c0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
152d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
152e0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
152f0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
15300 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73  nsaction.  The s
15310 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
15320 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  n.** can be roll
15330 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ed back independ
15340 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
15350 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  n transaction..*
15360 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  * You must start
15370 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
15380 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
15390 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
153a0 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73  .** The subtrans
153b0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
153c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66  automatically if
153d0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
153e0 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73  ction.** commits
153f0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
15400 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73  **.** Only one s
15410 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  ubtransaction ma
15420 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61  y be active at a
15430 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e   time.  It is an
15440 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a   error to try.**
15450 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
15460 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
15470 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61  f another subtra
15480 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
15490 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a  ady active..**.*
154a0 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
154b0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
154c0 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
154d0 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
154e0 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
154f0 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
15500 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
15510 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
15520 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
15530 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
15540 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
15550 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
15560 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
15570 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
15580 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
15590 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
155a0 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
155b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
155c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
155d0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
155e0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
155f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15600 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 28 70  p->pBt;.  if( (p
15610 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
15620 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
15630 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 65  inStmt ){.    re
15640 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
15650 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
15660 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
15670 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
15680 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
15690 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
156a0 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 70 42 74  TE );.  rc = pBt
156b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
156c0 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
156d0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
156e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70  Bt->pPager);.  p
156f0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  Bt->inStmt = 1;.
15700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15710 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
15720 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72  e statment subtr
15730 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
15740 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
15750 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72    If no.** subtr
15760 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
15770 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ive, this is a n
15780 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
15790 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
157a0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
157b0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
157c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
157d0 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  t;.  if( pBt->in
157e0 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
157f0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
15800 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
15810 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70  tmtCommit(pBt->p
15820 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
15830 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15840 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  _OK;.  }.  pBt->
15850 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65  inStmt = 0;.  re
15860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15870 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
15880 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
15890 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
158a0 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
158b0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
158c0 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
158d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
158e0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
158f0 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
15900 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
15910 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
15920 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
15930 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
15940 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
15950 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
15960 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
15970 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
15980 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15990 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
159a0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
159b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
159c0 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
159d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
159e0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61  qlite3MallocDisa
159f0 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28 20 70 42  llow();.  if( pB
15a00 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
15a10 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
15a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15a30 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
15a40 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15a50 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
15a60 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
15a70 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
15a80 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
15a90 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  .  sqlite3Malloc
15aa0 41 6c 6c 6f 77 28 29 3b 0a 20 20 72 65 74 75 72  Allow();.  retur
15ab0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
15ac0 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61  efault key compa
15ad0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  rison function t
15ae0 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f 20  o be used if no 
15af0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
15b00 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69 66  ion.** is specif
15b10 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69 74  ied on the sqlit
15b20 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20  e3BtreeCursor() 
15b30 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
15b40 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65 28  int dfltCompare(
15b50 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
15b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15b70 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e 6f   User data is no
15b80 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  t used */.  int 
15b90 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  n1, const void *
15ba0 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  p1,    /* First 
15bb0 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
15bc0 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73  /.  int n2, cons
15bd0 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20 2f  t void *p2     /
15be0 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20  * Second key to 
15bf0 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20  compare */.){.  
15c00 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d  int c;.  c = mem
15c10 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e  cmp(p1, p2, n1<n
15c20 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20  2 ? n1 : n2);.  
15c30 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
15c40 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d  c = n1 - n2;.  }
15c50 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
15c60 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
15c70 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
15c80 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
15c90 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
15ca0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
15cb0 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
15cc0 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
15cd0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
15ce0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15cf0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
15d00 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
15d10 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
15d20 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
15d30 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
15d40 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
15d50 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
15d60 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
15d70 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
15d80 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
15d90 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
15da0 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
15db0 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
15dc0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
15dd0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
15de0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
15df0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
15e00 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
15e10 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
15e20 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
15e30 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
15e40 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
15e50 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15e60 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
15e70 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
15e80 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
15e90 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
15ea0 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
15eb0 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
15ec0 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
15ed0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
15ee0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
15ef0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
15f00 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
15f10 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
15f20 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
15f30 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
15f40 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
15f50 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
15f60 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
15f70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15f80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
15f90 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
15fa0 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
15fb0 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
15fc0 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
15fd0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
15fe0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
15ff0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
16000 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
16010 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
16020 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
16030 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
16040 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
16050 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
16060 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
16070 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
16080 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
16090 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
160a0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
160b0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
160c0 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73 61  logically the sa
160d0 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  me for every cur
160e0 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74  sor.** on a part
160f0 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 43  icular table.  C
16100 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d 70  hanging the comp
16110 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
16120 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
16130 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65 72  n incorrect oper
16140 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20  ations.  If the 
16150 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16160 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a  ion is NULL, a.*
16170 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61 72  * default compar
16180 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
16190 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d 70   used.  The comp
161a0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
161b0 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e  is.** always ign
161c0 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59 20  ored for INTKEY 
161d0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  tables..*/.int s
161e0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
161f0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
16230 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16260 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
16270 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
16280 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162b0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
162c0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  ead-only */.  in
162d0 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c  t (*xCmp)(void*,
162e0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
162f0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
16300 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69  , /* Key Compari
16310 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f  son func */.  vo
16320 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
16350 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
16360 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
16370 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20  or **ppCur      
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
163a0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
163b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
163c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
163d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
163e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70   = p->pBt;..  *p
163f0 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  pCur = 0;.  if( 
16400 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  wrFlag ){.    if
16410 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
16420 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16430 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
16450 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
16460 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20   iTable, 0) ){. 
16470 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16480 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  TE_LOCKED;.    }
16490 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d  .  }..  if( pBt-
164a0 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
164b0 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
164c0 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20  WithRetry(p);.  
164d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
164e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
164f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16500 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
16510 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
16520 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  *pCur) );.  if( 
16530 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCur==0 ){.    r
16540 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16550 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
16560 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
16570 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  on;.  }.  pCur->
16580 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
16590 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69  )iTable;.  if( i
165a0 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69  Table==1 && sqli
165b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
165c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
165d0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
165e0 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
165f0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
16600 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
16610 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
16620 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
16630 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
16640 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20  ur->pPage, 0);. 
16650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16660 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
16670 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
16680 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  eption;.  }..  /
16690 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
166a0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
166b0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
166c0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
166d0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
166e0 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75  les, link the cu
166f0 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
16700 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20  Shared list and 
16710 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a  set *ppCur (the.
16720 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75    ** output argu
16730 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
16740 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70  ction)..  */.  p
16750 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20  Cur->xCompare = 
16760 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66  xCmp ? xCmp : df
16770 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75  ltCompare;.  pCu
16780 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  r->pArg = pArg;.
16790 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
167a0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c   p;.  pCur->wrFl
167b0 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70  ag = wrFlag;.  p
167c0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
167d0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
167e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
167f0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
16800 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
16810 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
16820 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
16830 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
16840 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70  R_INVALID;.  *pp
16850 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72  Cur = pCur;..  r
16860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16870 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65  .create_cursor_e
16880 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20  xception:.  if( 
16890 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65  pCur ){.    rele
168a0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
168b0 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
168c0 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Free(pCur);.  }.
168d0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
168e0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
168f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
16900 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a  0  /* Not Used *
16910 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  /./*.** Change t
16920 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
16930 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16940 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20 63 75  ion used by a cu
16950 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
16960 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d  lite3BtreeSetCom
16970 70 61 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72  pare(.  BtCursor
16980 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54   *pCur,     /* T
16990 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f  he cursor to who
169a0 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  se comparison fu
169b0 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65  nction is change
169c0 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70  d */.  int(*xCmp
169d0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
169e0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
169f0 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77  t void*), /* New
16a00 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16a10 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
16a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
16a30 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
16a40 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43  Cmp() */.){.  pC
16a50 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78  ur->xCompare = x
16a60 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c  Cmp ? xCmp : dfl
16a70 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72  tCompare;.  pCur
16a80 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d  ->pArg = pArg;.}
16a90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
16aa0 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
16ab0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
16ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16ad0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
16ae0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
16af0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
16b00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b10 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
16b20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
16b30 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16b40 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
16b50 2d 3e 70 42 74 3b 0a 20 20 72 65 73 74 6f 72 65  ->pBt;.  restore
16b60 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
16b70 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a  ition(pCur, 0);.
16b80 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
16b90 76 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  v ){.    pCur->p
16ba0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
16bb0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  ur->pNext;.  }el
16bc0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  se{.    pBt->pCu
16bd0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
16be0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  xt;.  }.  if( pC
16bf0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
16c00 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
16c10 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
16c20 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  v;.  }.  release
16c30 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
16c40 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
16c50 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
16c60 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
16c70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16c80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16c90 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
16ca0 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
16cb0 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
16cc0 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
16cd0 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
16ce0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
16cf0 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
16d00 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
16d10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
16d20 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
16d30 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
16d40 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
16d50 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43  .  memcpy(pTempC
16d60 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66  ur, pCur, sizeof
16d70 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d  (*pCur));.  pTem
16d80 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pCur->pNext = 0;
16d90 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72  .  pTempCur->pPr
16da0 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54  ev = 0;.  if( pT
16db0 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  empCur->pPage ){
16dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16dd0 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70  rRef(pTempCur->p
16de0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
16df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
16e00 65 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ete a temporary 
16e10 63 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77  cursor such as w
16e20 61 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43  as made by the C
16e30 72 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75  reateTemporaryCu
16e40 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rsor().** functi
16e50 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  on above..*/.sta
16e60 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
16e70 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
16e80 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
16e90 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b  ( pCur->pPage ){
16ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16eb0 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61  rUnref(pCur->pPa
16ec0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
16ed0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
16ee0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
16ef0 72 2e 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20  r.info field of 
16f00 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
16f10 20 69 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66   is valid..** If
16f20 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
16f30 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70  dy valid, call p
16f40 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
16f50 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
16f60 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
16f70 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
16f80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
16f90 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
16fa0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
16fb0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
16fc0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
16fd0 20 74 6f 20 70 61 72 73 65 43 65 6c 6c 28 29 2e   to parseCell().
16fe0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16ff0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
17000 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
17010 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
17020 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  ize==0 ){.    pa
17030 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
17040 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
17050 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
17060 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e  }else{.#ifndef N
17070 44 45 42 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e  DEBUG.    CellIn
17080 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
17090 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
170a0 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
170b0 20 70 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d   parseCell(pCur-
170c0 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  >pPage, pCur->id
170d0 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  x, &info);.    a
170e0 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
170f0 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
17100 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
17110 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  =0 );.#endif.  }
17120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
17130 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
17140 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
17150 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
17160 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
17170 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
17180 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
17190 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
171a0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
171b0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
171c0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
171d0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
171e0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
171f0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
17200 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
17210 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
17220 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
17230 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
17240 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
17250 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17260 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
17270 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
17280 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
17290 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
172a0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
172b0 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
172c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
172d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
172e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
172f0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
17300 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
17310 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
17320 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17330 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
17340 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
17350 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
17360 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
17370 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
17380 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
17390 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
173a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
173b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
173c0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
173d0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
173e0 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
173f0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
17400 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
17410 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17420 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
17430 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
17440 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
17450 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
17460 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
17470 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
17480 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
17490 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
174a0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
174b0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
174c0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
174d0 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
174e0 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
174f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
17500 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
17510 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65  int rc = restore
17520 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
17530 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
17540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17550 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
17560 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
17570 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
17580 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
17590 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
175a0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
175b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
175c0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
175d0 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
175e0 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
175f0 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
17600 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
17610 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
17620 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
17630 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
17640 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
17650 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
17660 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
17680 64 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  d payload inform
17690 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
176a0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
176b0 75 72 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  ur cursor is.** 
176c0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65  pointing to.  Be
176d0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 65 20  gin reading the 
176e0 70 61 79 6c 6f 61 64 20 61 74 20 22 6f 66 66 73  payload at "offs
176f0 65 74 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  et" and read.** 
17700 61 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  a total of "amt"
17710 20 62 79 74 65 73 2e 20 20 50 75 74 20 74 68 65   bytes.  Put the
17720 20 72 65 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e   result in zBuf.
17730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17740 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ine does not mak
17750 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20  e a distinction 
17760 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20  between key and 
17770 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74  data..** It just
17780 20 72 65 61 64 73 20 62 79 74 65 73 20 66 72 6f   reads bytes fro
17790 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
177a0 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
177b0 61 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65  appear.** on the
177c0 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
177d0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
177e0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
177f0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74  low pages..*/.st
17800 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c  atic int getPayl
17810 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
17820 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
17830 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
17840 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
17850 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  from */.  int of
17860 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
17870 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
17880 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
17890 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61  yload */.  int a
178a0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
178b0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
178c0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
178d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
178e0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
178f0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
17900 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
17910 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
17920 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e   /* offset begin
17930 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  s at data if thi
17940 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
17950 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
17960 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e  *aPayload;.  Pgn
17970 6f 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 69 6e  o nextPage;.  in
17980 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
17990 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  *pPage;.  BtShar
179a0 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f  ed *pBt;.  int o
179b0 76 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e  vflSize;.  u32 n
179c0 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Key;..  assert( 
179d0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
179e0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
179f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
17a00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
17a10 44 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43 75  D );.  pBt = pCu
17a20 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
17a30 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
17a40 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
17a50 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
17a60 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
17a70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
17a80 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
17a90 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
17aa0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
17ab0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
17ac0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
17ad0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
17ae0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
17af0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
17b00 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
17b10 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
17b20 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  et>=0 );.  if( s
17b30 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66  kipKey ){.    of
17b40 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  fset += nKey;.  
17b50 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  }.  if( offset+a
17b60 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
17b70 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20  info.nData ){.  
17b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b90 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
17ba0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
17bb0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
17bc0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
17bd0 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
17be0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
17bf0 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
17c00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
17c10 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
17c20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
17c30 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65   &aPayload[offse
17c40 74 5d 2c 20 61 29 3b 0a 20 20 20 20 69 66 28 20  t], a);.    if( 
17c50 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 20 20  a==amt ){.      
17c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 73  ;.    }.    offs
17c80 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
17c90 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
17ca0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
17cb0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
17cc0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
17cd0 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65 20 3d 20   }.  ovflSize = 
17ce0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
17cf0 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30  - 4;.  if( amt>0
17d00 20 29 7b 0a 20 20 20 20 6e 65 78 74 50 61 67 65   ){.    nextPage
17d10 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
17d20 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
17d30 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20 20 77  .nLocal]);.    w
17d40 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 6e  hile( amt>0 && n
17d50 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
17d60 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
17d70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
17d80 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
17d90 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
17da0 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
17db0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
17dc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17dd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
17de0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
17df0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
17e00 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
17e10 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
17e20 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
17e30 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
17e40 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  t<ovflSize ){.  
17e50 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
17e60 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
17e70 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
17e80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
17e90 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
17ea0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
17eb0 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
17ec0 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61  y(pBuf, &aPayloa
17ed0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b  d[offset+4], a);
17ee0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
17ef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 6d 74  = 0;.        amt
17f00 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
17f10 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
17f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f  }else{.        o
17f30 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
17f40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
17f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
17f60 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
17f70 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d   }.  }..  if( am
17f80 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
17f90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17fa0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
17fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17fc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
17fd0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
17fe0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
17ff0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
18000 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
18010 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
18020 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
18030 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
18040 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
18050 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
18060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18070 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
18080 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
18090 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
180a0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
180b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
180c0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
180d0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
180e0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
180f0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
18100 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
18110 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
18120 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
18130 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
18140 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
18150 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
18160 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20  tion(pCur, 1);. 
18170 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18180 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
18190 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
181a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
181b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
181c0 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
181d0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67    if( pCur->pPag
181e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
181f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18200 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18210 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18220 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
18230 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  tKey==0 );.    a
18240 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
18250 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
18260 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
18270 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
18280 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  getPayload(pCur,
18290 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
182a0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
182b0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
182c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
182d0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
182e0 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
182f0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
18300 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
18310 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
18320 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
18330 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
18340 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
18350 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
18360 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
18370 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18380 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
18390 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
183a0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
183b0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
183c0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
183d0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
183e0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
183f0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
18400 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18410 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
18420 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
18430 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
18440 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
18450 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
18460 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
18470 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28  (pCur, 1);.  if(
18480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18490 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
184a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
184b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
184c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
184d0 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
184e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
184f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
18500 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
18510 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ll );.    rc = g
18520 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  etPayload(pCur, 
18530 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
18540 66 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 1);.  }.  ret
18550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18560 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
18570 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
18580 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
18590 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
185a0 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
185b0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
185c0 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
185d0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
185e0 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
185f0 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
18600 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
18610 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
18620 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
18630 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
18640 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
18650 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
18660 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
18670 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
18680 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
18690 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
186a0 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
186b0 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
186c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
186d0 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
186e0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
186f0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
18700 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
18710 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
18720 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
18730 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
18740 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
18750 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
18760 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
18770 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
18780 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
18790 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
187a0 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
187b0 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
187c0 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
187d0 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
187e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
187f0 74 68 65 6e 20 67 65 74 50 61 79 6c 6f 61 64 28  then getPayload(
18800 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
18810 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20  o reassembly.** 
18820 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
18830 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
18840 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
18850 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
18860 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
18870 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
18880 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
18890 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
188a0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
188b0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
188c0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
188d0 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
188e0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
188f0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
18900 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
18910 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
18920 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
18930 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
18940 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
18950 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
18960 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
18970 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
18980 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
18990 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
189a0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
189b0 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
189c0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
189d0 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
189e0 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
189f0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
18a00 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
18a10 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
18a20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
18a30 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
18a40 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
18a50 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
18a60 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
18a70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18a80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18a90 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65  VALID );.  pPage
18aa0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
18ab0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18ac0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
18ad0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
18ae0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
18af0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
18b00 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
18b10 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
18b20 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
18b30 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
18b40 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
18b50 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
18b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
18b70 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
18b80 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
18b90 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
18ba0 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
18bb0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
18bc0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
18bd0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
18be0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
18bf0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
18c00 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b     if( nLocal>nK
18c10 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  ey ){.      nLoc
18c20 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d  al = nKey;.    }
18c30 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
18c40 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
18c50 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
18c60 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
18c70 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
18c80 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
18c90 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
18ca0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
18cb0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
18cc0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
18cd0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
18ce0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
18cf0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
18d00 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
18d10 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
18d20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
18d30 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
18d40 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
18d50 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
18d60 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
18d70 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
18d80 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
18d90 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
18da0 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
18db0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
18dc0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
18dd0 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
18de0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
18df0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
18e00 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
18e10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
18e20 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
18e30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18e40 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69   int *pAmt){.  i
18e50 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
18e60 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
18e70 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
18e80 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
18e90 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
18ea0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18eb0 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn 0;.}.const vo
18ec0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
18ed0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
18ee0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
18ef0 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Amt){.  if( pCur
18f00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18f10 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
18f20 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
18f30 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
18f40 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
18f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18f60 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
18f70 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
18f80 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
18f90 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
18fa0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
18fb0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
18fc0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
18fd0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a   to move to..*/.
18fe0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
18ff0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
19000 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
19010 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
19020 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
19030 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
19040 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61  OldPage;.  BtSha
19050 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
19060 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20  >pBtree->pBt;.. 
19070 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19080 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19090 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67 65  LID );.  rc = ge
190a0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
190b0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
190c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61 67  Page, pCur->pPag
190d0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
190e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77  eturn rc;.  pNew
190f0 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20  Page->idxParent 
19100 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70  = pCur->idx;.  p
19110 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  OldPage = pCur->
19120 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67  pPage;.  pOldPag
19130 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
19140 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19150 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72  OldPage);.  pCur
19160 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61  ->pPage = pNewPa
19170 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20  ge;.  pCur->idx 
19180 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
19190 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
191a0 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
191b0 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75  ll<1 ){.    retu
191c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
191d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
191e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
191f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19200 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
19210 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20   is the virtual 
19220 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c  root of its tabl
19230 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72  e..**.** The vir
19240 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
19250 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
19260 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e  for most tables.
19270 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65    But.** for the
19280 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e   table rooted on
19290 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d   page 1, sometim
192a0 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20  e the real root 
192b0 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79  page.** is empty
192c0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
192d0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20  right-pointer.  
192e0 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68  In such cases th
192f0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  e.** virtual roo
19300 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  t page is the pa
19310 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ge that the righ
19320 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67  t-pointer of pag
19330 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69  e.** 1 is pointi
19340 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ng to..*/.static
19350 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65 28   int isRootPage(
19360 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
19370 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
19380 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
19390 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
193a0 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
193b0 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
193c0 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
193d0 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
193e0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
193f0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
19400 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
19410 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
19420 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
19430 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
19440 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
19450 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
19460 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
19470 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
19480 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
19490 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
194a0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
194b0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
194c0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
194d0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
194e0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
194f0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
19500 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
19510 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
19520 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
19530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19540 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
19550 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
19560 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
19570 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
19580 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61  age;.  int idxPa
19590 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
195a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
195b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
195c0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
195d0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
195e0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  pPage!=0 );.  as
195f0 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61 67  sert( !isRootPag
19600 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 50  e(pPage) );.  pP
19610 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
19620 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
19630 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  ( pParent!=0 );.
19640 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50    idxParent = pP
19650 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a  age->idxParent;.
19660 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
19670 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
19680 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
19690 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75  ge(pPage);.  pCu
196a0 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65  r->pPage = pPare
196b0 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  nt;.  pCur->info
196c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73  .nSize = 0;.  as
196d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
196e0 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
196f0 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
19700 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
19710 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
19720 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
19730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
19740 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
19750 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
19760 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
19770 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19780 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
19790 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
197a0 65 2d 3e 70 42 74 3b 0a 0a 20 20 72 65 73 74 6f  e->pBt;..  resto
197b0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
197c0 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29  osition(pCur, 0)
197d0 3b 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ;.  pRoot = pCur
197e0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
197f0 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  Root && pRoot->p
19800 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
19810 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  oot ){.    asser
19820 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
19830 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
19840 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
19850 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
19860 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
19870 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
19880 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20   &pRoot, 0)).   
19890 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
198a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
198b0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
198c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
198d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
198e0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
198f0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
19900 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
19910 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
19920 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
19930 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   0;.  if( pRoot-
19940 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
19950 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
19960 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
19970 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
19980 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
19990 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
199a0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
199b0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
199c0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
199d0 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
199e0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
199f0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
19a00 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
19a10 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
19a20 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75  page);.  }.  pCu
19a30 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43  r->eState = ((pC
19a40 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
19a50 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
19a60 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
19a70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19a80 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
19a90 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
19aa0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
19ab0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
19ac0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
19ad0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
19ae0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
19af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
19b00 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
19b10 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
19b20 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
19b30 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
19b40 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
19b50 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19b60 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
19b70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
19b80 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
19b90 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
19ba0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
19bb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19bc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
19bd0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
19be0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
19bf0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
19c00 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
19c10 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
19c20 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
19c30 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
19c40 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
19c50 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
19c60 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
19c70 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
19c80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
19c90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
19ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
19cc0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
19cd0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
19ce0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
19cf0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
19d00 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
19d10 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
19d20 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
19d30 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
19d40 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
19d50 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
19d60 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
19d70 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
19d80 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
19d90 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
19da0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
19db0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
19dc0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
19dd0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
19de0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
19df0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
19e00 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
19e10 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
19e20 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
19e30 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
19e40 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
19e50 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
19e60 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19e70 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
19e80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
19e90 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
19ea0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19eb0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ge;..  assert( p
19ec0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19ed0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
19ee0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
19ef0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
19f00 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
19f10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
19f20 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
19f30 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
19f40 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
19f50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
19f60 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
19f70 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
19f80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19f90 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
19fa0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
19fb0 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72  Cell - 1;.  pCur
19fc0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
19fd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19fe0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
19ff0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1a000 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1a010 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1a020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1a030 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1a040 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1a050 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1a060 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1a070 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1a080 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1a090 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1a0a0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1a0b0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1a0c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1a0d0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1a0e0 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  rc;.  rc = moveT
1a0f0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1a100 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a110 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  c;.  if( pCur->e
1a120 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1a130 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
1a140 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1a150 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1a160 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1a170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a180 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1a190 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1a1a0 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73  ell>0 );.  *pRes
1a1b0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76   = 0;.  rc = mov
1a1c0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1a1d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a1e0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1a1f0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1a200 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1a210 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1a220 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1a230 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1a240 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1a250 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1a260 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1a270 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1a280 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1a290 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1a2a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a2b0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1a2c0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1a2d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
1a2e0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1a2f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1a300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
1a310 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1a320 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1a330 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1a340 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1a350 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
1a360 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1a370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a380 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1a390 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1a3a0 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
1a3b0 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   0;.  rc = moveT
1a3c0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1a3d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a3e0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1a3f0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1a400 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1a410 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65  ry near pKey/nKe
1a420 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  y..** Return a s
1a430 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1a440 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1a450 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1a460 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1a470 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
1a480 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
1a490 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e   other tables, n
1a4a0 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Key is the numbe
1a4b0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1a4c0 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20  ta.** in pKey.  
1a4d0 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  The comparison f
1a4e0 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  unction specifie
1a4f0 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  d when the curso
1a500 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64  r was.** created
1a510 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
1a520 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  are keys..**.** 
1a530 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
1a540 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
1a550 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1a560 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
1a570 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1a580 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
1a590 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
1a5a0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
1a5b0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
1a5c0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
1a5d0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
1a5e0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
1a5f0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
1a600 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1a610 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1a620 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1a630 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1a640 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73  hich the.** curs
1a650 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  or is written to
1a660 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d   *pRes if pRes!=
1a670 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69  NULL.  The meani
1a680 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61  ng of.** this va
1a690 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  lue is as follow
1a6a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
1a6b0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
1a6c0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1a6d0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1a6e0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1a6f0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
1a700 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20  aller than pKey 
1a710 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1a720 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1a740 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1a750 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1a760 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1a770 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1a780 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1a790 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1a7a0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1a7b0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1a7c0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1a7d0 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a  matches pKey..**
1a7e0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
1a7f0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1a800 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1a810 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1a820 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1a830 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
1a840 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e  than pKey..*/.in
1a850 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1a860 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
1a870 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f   *pCur,        /
1a880 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1a890 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f  be moved */.  co
1a8a0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1a8b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1a8c0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69  content for indi
1a8d0 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62  ces.  Not used b
1a8e0 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36  y tables */.  i6
1a8f0 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1a900 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a910 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65  pKey.  Or the ke
1a920 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a  y for tables */.
1a930 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
1a940 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1a950 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
1a960 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
1a970 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
1a980 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
1a990 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c   /* Search resul
1a9a0 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69  t flag */.){.  i
1a9b0 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f  nt rc;.  rc = mo
1a9c0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1a9d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a9e0 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
1a9f0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
1aa00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1aa10 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1aa20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1aa30 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1aa40 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1aa50 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1aa60 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1aa70 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
1aa80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aa90 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  .  }.  for(;;){.
1aaa0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
1aab0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
1aac0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
1aad0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1aae0 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  age;.    int c =
1aaf0 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
1ab00 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
1ab10 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
1ab20 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
1ab30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
1ab40 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1ab50 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
1ab60 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b  ey && pKey==0 ){
1ab70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ab80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ab90 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
1aba0 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
1abb0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1abc0 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1abd0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1abe0 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20  = (upr+lwr)/2;. 
1abf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72     }.    if( lwr
1ac00 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b  <=upr ) for(;;){
1ac10 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65  .      void *pCe
1ac20 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34  llKey;.      i64
1ac30 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1ac40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1ac50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
1ac60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1ac70 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1ac80 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1ac90 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1aca0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1acb0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1acc0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1acd0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1ace0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1acf0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1ad00 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1ad10 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1ad20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
1ad30 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1ad40 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1ad50 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20   *)&nCellKey);. 
1ad60 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1ad70 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1ad80 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
1ad90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ada0 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b  nCellKey>nKey ){
1adb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1adc0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1add0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1ade0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1adf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae00 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1ae10 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1ae20 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1ae30 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1ae40 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1ae50 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1ae60 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1ae70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1ae80 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1ae90 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1aea0 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61  c = pCur->xCompa
1aeb0 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e  re(pCur->pArg, n
1aec0 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1aed0 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  y, nKey, pKey);.
1aee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1aef0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1af00 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
1af10 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  Raw( nCellKey );
1af20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1af30 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74  CellKey==0 ) ret
1af40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1af50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1af60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1af70 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b  (pCur, 0, nCellK
1af80 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c  ey, (void *)pCel
1af90 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1afa0 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70   c = pCur->xComp
1afb0 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20  are(pCur->pArg, 
1afc0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1afd0 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ey, nKey, pKey);
1afe0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1aff0 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  eFree(pCellKey);
1b000 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b010 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1b020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b030 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1b040 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1b050 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1b060 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1b070 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1b080 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1b090 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1b0a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1b0b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b0d0 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1b0e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1b0f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b110 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1b120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1b130 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1b140 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b150 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1b160 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1b170 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1b180 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
1b190 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b1a0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c    pCur->idx = (l
1b1b0 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d  wr+upr)/2;.    }
1b1c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1b1d0 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1b1e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1b1f0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1b200 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1b210 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1b220 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1b230 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1b240 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1b250 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1b260 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1b270 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1b280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b290 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1b2a0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1b2b0 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1b2c0 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1b2d0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1b2e0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1b2f0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
1b300 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
1b310 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1b320 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1b330 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b340 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b350 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72   pCur->idx = lwr
1b360 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1b370 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1b380 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1b390 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
1b3a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1b3b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b3c0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f     }.  }.  /* NO
1b3d0 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a  T REACHED */.}..
1b3e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1b3f0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1b400 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1b410 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1b420 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1b430 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1b440 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1b450 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1b460 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1b470 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1b480 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1b490 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1b4a0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1b4b0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1b4c0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1b4d0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1b4e0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1b4f0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1b500 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1b510 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1b520 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1b530 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1b540 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1b550 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1b560 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1b570 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1b580 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1b590 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1b5a0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1b5b0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1b5c0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1b5d0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1b5e0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1b5f0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1b600 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1b610 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1b620 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1b630 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1b640 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1b650 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1b660 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1b670 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1b680 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1b690 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1b6a0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1b6b0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1b6c0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1b6d0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1b6e0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1b6f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b700 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1b710 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1b720 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1b730 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1b740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b750 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1b760 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1b770 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1b780 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20  tion(pCur, 1);. 
1b790 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b7a0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1b7b0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
1b7c0 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20  Cur->skip>0 ){. 
1b7d0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1b7e0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1b7f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b800 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1b810 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65  ur->skip = 0;.#e
1b820 6e 64 69 66 20 0a 0a 20 20 61 73 73 65 72 74 28  ndif ..  assert(
1b830 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50   pRes!=0 );.  pP
1b840 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1b850 65 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  e;.  if( CURSOR_
1b860 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1b870 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1b880 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1b890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b8a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1b8b0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1b8c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1b8d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1b8e0 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1b8f0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1b900 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1b910 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1b920 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
1b930 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1b940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
1b950 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
1b960 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b970 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b980 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
1b990 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1b9a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
1b9b0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1b9c0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1b9d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1b9e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b9f0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
1ba00 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61  ( isRootPage(pPa
1ba10 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ge) ){.        *
1ba20 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1ba30 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1ba40 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1ba50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ba60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ba70 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
1ba80 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1ba90 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1baa0 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69  >pPage;.    }whi
1bab0 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  le( pCur->idx>=p
1bac0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1bad0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1bae0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1baf0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72  fData ){.      r
1bb00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1bb10 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
1bb20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bb30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1bb40 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
1bb50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
1bb60 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
1bb70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bb80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bb90 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
1bba0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1bbb0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
1bbc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  ;.}../*.** Step 
1bbd0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1bbe0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
1bbf0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
1bc00 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1bc10 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1bc20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1bc30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1bc40 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1bc50 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1bc60 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1bc70 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
1bc80 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1bc90 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
1bca0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
1bcb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bcc0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
1bcd0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1bce0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1bcf0 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  c;.  Pgno pgno;.
1bd00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1bd10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1bd20 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1bd30 43 48 45 0a 20 20 72 63 20 3d 20 72 65 73 74 6f  CHE.  rc = resto
1bd40 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
1bd50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29  osition(pCur, 1)
1bd60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1bd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1bd80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1bd90 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29  ( pCur->skip<0 )
1bda0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1bdb0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1bdc0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1bdd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1bde0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1bdf0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 43  .#endif..  if( C
1be00 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1be10 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1be20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1be30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1be40 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  OK;.  }..  pPage
1be50 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1be60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1be70 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1be80 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1be90 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1bea0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1beb0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1bec0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1bed0 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1bee0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1bef0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1bf00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1bf10 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1bf20 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1bf30 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
1bf40 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
1bf50 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ->idx==0 ){.    
1bf60 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65    if( isRootPage
1bf70 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  (pPage) ){.     
1bf80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1bf90 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1bfa0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
1bfb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
1bfc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bfd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
1bfe0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1bff0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1c000 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1c010 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d  }.    pCur->idx-
1c020 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  -;.    pCur->inf
1c030 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1c040 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1c050 44 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e  Data && !pPage->
1c060 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1c070 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1c080 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1c090 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1c0a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c0b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1c0c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1c0d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c0e0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1c0f0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1c100 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1c110 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1c120 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1c130 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1c140 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
1c150 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
1c160 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c170 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1c180 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1c190 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1c1a0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1c1b0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1c1c0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1c1d0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1c1e0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1c1f0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1c200 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1c210 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1c220 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1c230 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1c240 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1c250 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1c260 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1c270 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1c280 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1c290 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1c2a0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1c2b0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1c2c0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
1c2d0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
1c2e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1c2f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1c300 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
1c310 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1c320 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
1c330 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
1c340 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
1c350 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
1c360 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1c370 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
1c380 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
1c390 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
1c3a0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
1c3b0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
1c3c0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
1c3d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
1c3e0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
1c3f0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
1c400 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
1c410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
1c420 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
1c430 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
1c440 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
1c450 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
1c460 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
1c470 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
1c480 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
1c490 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
1c4a0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
1c4b0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1c4c0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
1c4d0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
1c4e0 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
1c4f0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1c500 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
1c510 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1c520 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1c530 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1c540 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
1c550 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
1c560 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c570 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
1c580 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
1c590 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1c5a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1c5b0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
1c5c0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1c5d0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
1c5e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1c5f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
1c600 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
1c610 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
1c620 30 3b 0a 0a 20 20 70 50 61 67 65 31 20 3d 20 70  0;..  pPage1 = p
1c630 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
1c640 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1c650 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1c660 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1c670 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
1c680 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1c690 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
1c6a0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
1c6b0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
1c6c0 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
1c6d0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1c6e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1c6f0 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1c700 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1c710 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1c720 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1c730 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1c740 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1c750 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1c760 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1c770 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1c780 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1c790 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1c7a0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1c7b0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1c7c0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1c7d0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1c7e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1c7f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1c800 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1c810 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1c820 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1c830 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1c840 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1c850 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1c860 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1c870 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1c880 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1c890 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c8a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1c8b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1c8c0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1c8d0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1c8e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c8f0 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1c900 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1c910 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1c920 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1c930 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1c940 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1c950 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1c960 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1c970 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1c980 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1c990 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1c9a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c9b0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1c9c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1c9d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1c9e0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1c9f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1ca00 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1ca10 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1ca20 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1ca30 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1ca40 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1ca50 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1ca60 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1ca70 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1ca80 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1ca90 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1caa0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1cab0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1cac0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1cad0 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1cae0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1caf0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1cb00 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1cb10 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1cb20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1cb30 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1cb40 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1cb50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cb60 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1cb70 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1cb80 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1cb90 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
1cba0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
1cbb0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1cbc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1cbd0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1cbe0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1cbf0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1cc00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b        }..      k
1cc10 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1cc20 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1cc30 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
1cc40 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
1cc50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1cc60 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
1cc70 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
1cc80 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
1cc90 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
1cca0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
1ccb0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
1ccc0 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
1ccd0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
1cce0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
1ccf0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
1cd00 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
1cd10 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
1cd20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cd30 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1cd40 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1cd50 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1cd60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1cd70 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1cd80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cd90 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
1cda0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
1cdb0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1cdc0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1cdd0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1cde0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1cdf0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1ce00 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1ce10 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1ce20 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
1ce30 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
1ce40 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
1ce50 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
1ce60 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73  se if( k>pBt->us
1ce70 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1ce80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
1ce90 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
1cea0 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
1ceb0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
1cec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ced0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1cee0 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
1cef0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1cf00 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1cf10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1cf20 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
1cf30 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
1cf40 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
1cf50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1cf60 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
1cf70 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
1cf80 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
1cf90 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1cfa0 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
1cfb0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1cfc0 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
1cfd0 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
1cfe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1cff0 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
1d000 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1d010 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1d020 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1d030 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
1d040 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d050 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1d060 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1d070 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1d080 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1d090 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1d0a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
1d0b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1d0c0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1d0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d0e0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1d0f0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1d100 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1d110 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1d120 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
1d130 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
1d140 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1d150 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1d160 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1d170 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d190 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
1d1a0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
1d1b0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
1d1c0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
1d1d0 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
1d1e0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
1d1f0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
1d200 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
1d210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
1d220 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1d230 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1d240 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1d250 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
1d260 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
1d270 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1d280 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
1d290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1d2a0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69  = getPage(pBt, i
1d2b0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1d2c0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1d2d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d2e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d2f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1d300 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1d310 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d330 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
1d340 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1d350 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d370 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1d380 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1d390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1d3a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1d3b0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1d3c0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
1d3d0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1d3e0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1d3f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d400 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d410 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
1d420 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1d430 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1d440 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1d450 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
1d460 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
1d470 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
1d480 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1d490 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1d4a0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1d4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1d4c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1d4d0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
1d4e0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1d4f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d500 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d510 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
1d520 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
1d530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1d540 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d550 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1d560 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1d570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d580 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d590 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1d5a0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
1d5b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
1d5c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d5d0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1d5e0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1d5f0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1d600 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1d610 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1d620 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
1d630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d640 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1d650 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
1d660 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1d670 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
1d680 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
1d690 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1d6a0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1d6b0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
1d6c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d6d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1d6e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1d6f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1d700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1d710 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1d720 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1d730 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
1d740 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
1d750 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
1d760 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1d770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
1d780 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1d790 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
1d7a0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
1d7b0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
1d7c0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
1d7d0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
1d7e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1d7f0 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
1d800 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
1d810 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
1d820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1d830 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
1d840 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1d850 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
1d860 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1d870 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
1d880 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
1d890 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d8b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d8c0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1d8d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d8e0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
1d8f0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
1d900 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
1d910 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
1d920 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
1d930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
1d940 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
1d950 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67          if( *pPg
1d960 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1d970 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1d980 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1d990 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1d9a0 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1d9b0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1d9c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d9d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d9e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
1d9f0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1da00 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1da10 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
1da20 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
1da50 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
1da60 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
1da70 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
1da80 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
1da90 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
1daa0 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
1dab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1dac0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
1dad0 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
1dae0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
1daf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
1db10 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1db20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
1db30 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1db40 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
1db50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1db60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1db80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1db90 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1dba0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1dbb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dbc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dbd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1dbe0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
1dbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dc00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
1dc10 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1dc20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1dc30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dc40 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1dc50 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1dc60 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
1dc70 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
1dc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1dc90 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
1dca0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1dcb0 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
1dcc0 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
1dcd0 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
1dce0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50   file */.    *pP
1dcf0 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67  gno = sqlite3Pag
1dd00 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1dd10 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23  >pPager) + 1;..#
1dd20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dd30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1dd40 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1dd50 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
1dd60 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
1dd70 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
1dd80 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
1dd90 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
1dda0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
1ddb0 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
1ddc0 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
1ddd0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
1dde0 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
1ddf0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
1de00 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
1de10 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
1de20 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1de30 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
1de40 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
1de50 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
1de60 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1de70 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
1de80 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
1de90 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
1dea0 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
1deb0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1dec0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ded0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28  (pBt) );.      (
1dee0 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d  *pPgno)++;.    }
1def0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
1df00 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1df10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1df20 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
1df30 67 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  getPage(pBt, *pP
1df40 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
1df50 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1df60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1df70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1df80 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
1df90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1dfa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dfb0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1dfc0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1dfd0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
1dfe0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1dff0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
1e000 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
1e010 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
1e020 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1e030 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
1e040 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
1e050 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1e060 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
1e070 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1e080 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e090 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
1e0a0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1e0b0 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
1e0c0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
1e0d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e0e0 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
1e0f0 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
1e100 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
1e110 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1e120 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
1e130 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1e140 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1e150 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1e160 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
1e170 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
1e180 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
1e190 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
1e1a0 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
1e1b0 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  1 );.  pPage->is
1e1c0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Init = 0;.  rele
1e1d0 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70  asePage(pPage->p
1e1e0 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65  Parent);.  pPage
1e1f0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a  ->pParent = 0;..
1e200 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1e210 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
1e220 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
1e230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e240 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1e250 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
1e260 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e270 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1e280 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e290 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
1e2a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e2b0 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
1e2c0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1e2d0 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
1e2e0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
1e2f0 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
1e300 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
1e310 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
1e320 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
1e330 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
1e340 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
1e350 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
1e360 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e370 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1e380 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1e390 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e3a0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
1e3b0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
1e3c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
1e3d0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1e3e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e3f0 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
1e400 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
1e410 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
1e420 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
1e430 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
1e440 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
1e450 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
1e460 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
1e470 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1e480 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1e490 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1e4a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54   pPage->pgno, PT
1e4b0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
1e4c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e4d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1e4e0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d  endif..  if( n==
1e4f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1e500 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72   is the first fr
1e510 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  ee page */.    r
1e520 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e530 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1e540 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e550 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e560 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
1e570 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
1e580 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1e590 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e5a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1e5b0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1e5c0 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
1e5d0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
1e5e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1e5f0 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
1e600 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
1e610 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
1e620 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
1e630 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
1e640 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
1e650 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
1e660 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
1e670 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1e680 6b 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  k;.    rc = getP
1e690 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
1e6a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e6b0 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20  [32]), &pTrunk, 
1e6c0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1e6d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e6e0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1e6f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
1e700 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d  .    if( k>=pBt-
1e710 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
1e720 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  8 ){.      /* Th
1e730 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e  e trunk is full.
1e740 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65 20    Turn the page 
1e750 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f  being freed into
1e760 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20   a new.      ** 
1e770 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20  trunk page with 
1e780 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20  no leaves. */.  
1e790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e7a0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1e7b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e7c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e7d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34  n rc;.      put4
1e7e0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1e7f0 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  a, pTrunk->pgno)
1e800 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e810 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
1e820 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1e830 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1e840 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
1e850 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52  >pgno);.      TR
1e860 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1e870 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
1e880 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
1e890 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e8a0 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70    pPage->pgno, p
1e8b0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
1e8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e8d0 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79  /* Add the newly
1e8e0 20 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61   freed page as a
1e8f0 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72   leaf on the cur
1e900 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20  rent trunk */.  
1e910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e920 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1e930 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1e940 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e950 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74  rn rc;.      put
1e960 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1e970 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20  Data[4], k+1);. 
1e980 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e990 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b  Trunk->aData[8+k
1e9a0 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  *4], pPage->pgno
1e9b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1e9c0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1e9d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e9e0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 42 74 2d  erDontWrite(pBt-
1e9f0 3e 70 50 61 67 65 72 2c 20 70 50 61 67 65 2d 3e  >pPager, pPage->
1ea00 70 67 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pgno);.#endif.  
1ea10 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
1ea20 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
1ea30 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
1ea40 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
1ea50 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
1ea60 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
1ea70 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1ea80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ea90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
1eaa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1eab0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1eac0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
1ead0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
1eae0 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
1eaf0 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
1eb00 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
1eb10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1eb20 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
1eb30 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1eb40 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
1eb50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
1eb60 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  Ovfl;.  int ovfl
1eb70 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 70 61 72  PageSize;..  par
1eb80 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
1eb90 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1eba0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
1ebb0 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
1ebc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ebd0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
1ebe0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
1ebf0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1ec00 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
1ec10 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
1ec20 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1ec30 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
1ec40 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
1ec50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1ec60 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
1ec70 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
1ec80 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
1ec90 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
1eca0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
1ecb0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
1ecc0 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
1ecd0 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
1ece0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
1ecf0 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
1ed00 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
1ed10 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  flPgno>sqlite3Pa
1ed20 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1ed30 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
1ed40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ed50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ed60 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
1ed70 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  tPage(pBt, ovflP
1ed80 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 30 29 3b  gno, &pOvfl, 0);
1ed90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1eda0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
1edb0 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
1edc0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
1edd0 79 74 65 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61  yte(pOvfl->aData
1ede0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
1edf0 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c  = freePage(pOvfl
1ee00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1ee10 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
1ee20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1ee30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ee40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ee50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ee60 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
1ee70 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
1ee80 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
1ee90 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
1eea0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
1eeb0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
1eec0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
1eed0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
1eee0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
1eef0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
1ef00 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
1ef10 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1ef20 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
1ef30 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1ef40 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
1ef50 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
1ef60 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
1ef70 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
1ef80 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
1ef90 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
1efa0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
1efb0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
1efc0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
1efd0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
1efe0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
1eff0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
1f000 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
1f010 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
1f020 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1f030 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
1f040 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
1f050 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
1f060 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
1f070 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
1f080 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
1f090 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1f0a0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1f0b0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
1f0c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
1f0d0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
1f0e0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
1f0f0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
1f100 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1f110 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
1f120 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
1f130 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
1f140 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
1f150 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
1f160 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f180 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
1f190 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
1f1a0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
1f1b0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
1f1c0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
1f1d0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
1f1e0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
1f1f0 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
1f200 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
1f210 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
1f220 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
1f230 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
1f240 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
1f250 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1f260 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
1f270 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
1f280 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
1f290 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a  Info info;..  /*
1f2a0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
1f2b0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
1f2c0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
1f2d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1f2e0 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
1f2f0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
1f300 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
1f310 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
1f320 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
1f330 65 72 5d 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  er], nData);.  }
1f340 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
1f350 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
1f360 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
1f370 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
1f380 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
1f390 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
1f3a0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1f3b0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
1f3c0 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
1f3d0 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
1f3e0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
1f3f0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
1f400 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61  nfo.nData==nData
1f410 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
1f420 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
1f430 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
1f440 6e 44 61 74 61 3b 0a 20 20 69 66 28 20 70 50 61  nData;.  if( pPa
1f450 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1f460 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
1f470 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
1f480 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
1f490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
1f4a0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
1f4b0 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
1f4c0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79  .    nSrc = nKey
1f4d0 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
1f4e0 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
1f4f0 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
1f500 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
1f510 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
1f520 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
1f530 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
1f540 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
1f550 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
1f560 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
1f570 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
1f580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f590 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
1f5a0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
1f5b0 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
1f5c0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
1f5d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
1f5e0 67 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  ge */.#endif.   
1f5f0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1f600 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1f610 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
1f620 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
1f630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f640 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f650 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
1f660 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
1f670 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
1f680 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
1f690 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
1f6a0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
1f6b0 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
1f6c0 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
1f6d0 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
1f6e0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
1f6f0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
1f700 2e 20 54 68 65 20 65 6e 74 72 79 20 66 6f 72 20  . The entry for 
1f710 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
1f720 6f 77 20 70 61 67 65 20 77 69 6c 6c 20 62 65 0a  ow page will be.
1f730 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 6c        ** added l
1f740 61 74 65 72 2c 20 62 79 20 74 68 65 20 69 6e 73  ater, by the ins
1f750 65 72 74 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ertCell() routin
1f760 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1f770 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1f780 61 63 75 75 6d 20 26 26 20 70 67 6e 6f 50 74 72  acuum && pgnoPtr
1f790 6d 61 70 21 3d 30 20 26 26 20 72 63 3d 3d 53 51  map!=0 && rc==SQ
1f7a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f7b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1f7c0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
1f7d0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1f7e0 32 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  2, pgnoPtrmap);.
1f7f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f800 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1f810 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1f820 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
1f830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f840 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1f850 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
1f860 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
1f870 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f880 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
1f890 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
1f8a0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
1f8b0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
1f8c0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
1f8d0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
1f8e0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
1f8f0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
1f900 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
1f910 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1f920 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
1f930 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
1f940 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
1f950 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
1f960 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 3e 6e  eft;.    if( n>n
1f970 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
1f980 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1f990 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   );.    memcpy(p
1f9a0 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
1f9b0 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  );.    nPayload 
1f9c0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
1f9d0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
1f9e0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
1f9f0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
1fa00 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
1fa10 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
1fa20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
1fa30 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
1fa40 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
1fa50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1fa60 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
1fa70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fa80 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1fa90 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  he MemPage.pPare
1faa0 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68  nt pointer on th
1fab0 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d  e page whose num
1fac0 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20  ber is.** given 
1fad0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
1fae0 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d  gument so that M
1faf0 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68  emPage.pParent h
1fb00 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e  olds the.** poin
1fb10 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72 64  ter in the third
1fb20 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1fb30 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e  atic int reparen
1fb40 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  tPage(BtShared *
1fb50 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pBt, Pgno pgno, 
1fb60 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72  MemPage *pNewPar
1fb70 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  ent, int idx){. 
1fb80 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b   MemPage *pThis;
1fb90 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
1fba0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ge;..  assert( p
1fbb0 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
1fbc0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
1fbd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fbe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1fbf0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
1fc00 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
1fc10 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
1fc20 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
1fc30 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
1fc40 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
1fc50 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
1fc60 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
1fc70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1fc80 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
1fc90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fca0 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 28 73 71  This->aData==(sq
1fcb0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1fcc0 61 28 70 44 62 50 61 67 65 29 29 20 29 3b 0a 20  a(pDbPage)) );. 
1fcd0 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
1fce0 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72  pParent!=pNewPar
1fcf0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ent ){.        i
1fd00 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
1fd10 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  t ) sqlite3Pager
1fd20 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61  Unref(pThis->pPa
1fd30 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
1fd40 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70          pThis->p
1fd50 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72  Parent = pNewPar
1fd60 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ent;.        sql
1fd70 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e 65  ite3PagerRef(pNe
1fd80 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  wParent->pDbPage
1fd90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fda0 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e   pThis->idxParen
1fdb0 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20  t = idx;.    }. 
1fdc0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1fdd0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
1fde0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1fdf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1fe00 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  UM.  if( pBt->au
1fe10 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1fe20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
1fe30 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  (pBt, pgno, PTRM
1fe40 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61  AP_BTREE, pNewPa
1fe50 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  rent->pgno);.  }
1fe60 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1fe70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1fe80 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1fe90 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e pParent pointe
1fea0 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65  r of all childre
1feb0 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f  n of pPage to po
1fec0 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70  int back.** to p
1fed0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  Page..**.** In o
1fee0 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20  ther words, for 
1fef0 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70  every child of p
1ff00 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70  Page, invoke rep
1ff10 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74  arentPage().** t
1ff20 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1ff30 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77   each child know
1ff40 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20  s that pPage is 
1ff50 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  its parent..**.*
1ff60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1ff70 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72  ets called after
1ff80 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e   you memcpy() on
1ff90 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61  e page into.** a
1ffa0 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nother..*/.stati
1ffb0 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68  c int reparentCh
1ffc0 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65  ildPages(MemPage
1ffd0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1ffe0 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  i;.  BtShared *p
1fff0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
20000 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20010 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
20020 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75  age->leaf ) retu
20030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
20040 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
20050 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
20060 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
20070 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
20080 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
20090 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
200a0 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
200b0 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
200c0 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c  e(pCell), pPage,
200d0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   i);.      if( r
200e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
200f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20100 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
20110 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
20120 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
20130 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
20140 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
20150 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
20160 2c 20 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c  , .       pPage,
20170 20 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   i);.    pPage->
20180 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
20190 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
201a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
201b0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
201c0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
201d0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
201e0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
201f0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
20200 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
20210 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
20220 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
20230 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
20240 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
20250 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
20260 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
20270 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
20280 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
20290 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
202a0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
202b0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
202c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
202d0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
202e0 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
202f0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
20300 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
20310 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
20320 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
20330 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
20340 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
20350 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
20360 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
20370 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
20380 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
20390 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
203a0 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
203b0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
203c0 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
203d0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
203e0 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
203f0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
20400 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
20410 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
20420 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
20430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20440 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
20450 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
20460 50 61 67 65 29 20 29 3b 0a 20 20 64 61 74 61 20  Page) );.  data 
20470 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
20480 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50    ptr = &data[pP
20490 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
204a0 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  + 2*idx];.  pc =
204b0 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
204c0 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30 20    assert( pc>10 
204d0 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d  && pc+sz<=pPage-
204e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
204f0 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28   );.  freeSpace(
20500 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
20510 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69    for(i=idx+1; i
20520 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
20530 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20  ++, ptr+=2){.   
20540 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d   ptr[0] = ptr[2]
20550 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70  ;.    ptr[1] = p
20560 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  tr[3];.  }.  pPa
20570 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70  ge->nCell--;.  p
20580 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
20590 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
205a0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
205b0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
205c0 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e   += 2;.  pPage->
205d0 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a  idxShift = 1;.}.
205e0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
205f0 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
20600 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
20610 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
20620 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
20630 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
20640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
20650 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
20660 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
20670 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
20680 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
20690 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
206a0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
206b0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
206c0 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
206d0 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
206e0 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
206f0 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
20700 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
20710 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
20720 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
20730 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
20740 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
20750 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
20760 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
20770 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
20780 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
20790 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
207a0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
207b0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
207c0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
207d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
207e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
207f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
20800 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
20810 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
20820 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
20830 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
20840 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
20850 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
20860 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
20870 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
20880 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
20890 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
208a0 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
208b0 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
208c0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
208d0 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
208e0 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
208f0 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
20900 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28   int insertCell(
20910 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
20920 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
20930 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
20940 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
20950 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
20960 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
20970 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
20980 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
20990 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
209a0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
209b0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
209c0 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
209d0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
209e0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
209f0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
20a00 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
20a10 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
20a20 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
20a30 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69  ded */.  u8 nSki
20a40 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  p          /* Do
20a50 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66   not write the f
20a60 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
20a70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
20a80 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  ){.  int idx;   
20a90 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
20aa0 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
20ab0 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
20ac0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
20ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20ae0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20af0 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
20b00 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
20b10 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  of content for a
20b20 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b  ny cell in data[
20b30 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  ] */.  int end; 
20b40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20b50 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
20b60 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
20b70 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
20b80 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
20b90 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
20ba0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
20bb0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
20bc0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
20bd0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
20be0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64  /* Offset into d
20bf0 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67  ata[] of the pag
20c00 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
20c10 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
20c20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
20c30 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
20c40 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
20c50 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
20c60 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
20c70 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
20c80 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
20c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
20ca0 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
20cb0 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
20cc0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
20cd0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
20ce0 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
20cf0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
20d00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
20d10 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
20d20 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20  age, pCell) );. 
20d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20d40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
20d50 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
20d60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
20d70 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
20d80 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
20d90 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
20da0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
20db0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
20dc0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
20dd0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
20de0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
20df0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
20e00 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
20e10 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f   assert( j<sizeo
20e20 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
20e30 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
20e40 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70  vfl[0]) );.    p
20e50 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
20e60 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
20e70 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
20e80 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70  ].idx = i;.    p
20e90 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  Page->nFree = 0;
20ea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61  .  }else{.    da
20eb0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
20ec0 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
20ed0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
20ee0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
20ef0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
20f00 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
20f10 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
20f20 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
20f30 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
20f40 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
20f50 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
20f60 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
20f70 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
20f80 73 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  sz ){.      int 
20f90 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
20fa0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
20fb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20fc0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20fd0 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74  .      top = get
20fe0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
20ff0 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  5]);.      asser
21000 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74  t( end + sz <= t
21010 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op );.    }.    
21020 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
21030 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a  ace(pPage, sz);.
21040 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
21050 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21060 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65   end <= get2byte
21070 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
21080 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
21090 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
210a0 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20  >nFree -= 2;.   
210b0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
210c0 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
210d0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
210e0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d  ;.    for(j=end-
210f0 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b  2, ptr=&data[j];
21100 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74   j>ins; j-=2, pt
21110 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72  r-=2){.      ptr
21120 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20  [0] = ptr[-2];. 
21130 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74       ptr[1] = pt
21140 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  r[-1];.    }.   
21150 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
21160 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
21170 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
21180 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
21190 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
211a0 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23  >idxShift = 1;.#
211b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
211c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
211d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
211e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
211f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
21200 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
21210 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
21220 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
21230 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
21240 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
21250 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
21260 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
21270 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
21280 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
21290 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 70 61 72   info;.      par
212a0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
212b0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
212c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
212d0 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
212e0 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
212f0 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
21300 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69  yload );.      i
21310 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
21320 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
21330 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
21340 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
21350 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
21360 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
21370 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
21380 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  w]);.        int
21390 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
213a0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f  pPage->pBt, pgno
213b0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
213c0 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
213d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
213e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
213f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
21400 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
21410 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  f.  }..  return 
21420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21430 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f  .** Add a list o
21440 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67  f cells to a pag
21450 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f  e.  The page sho
21460 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79  uld be initially
21470 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63   empty..** The c
21480 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74  ells are guarant
21490 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  eed to fit on th
214a0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
214b0 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50  c void assembleP
214c0 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
214d0 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20  pPage,   /* The 
214e0 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d  page to be assem
214f0 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  blied */.  int n
21500 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
21510 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  The number of ce
21520 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68  lls to add to th
21530 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
21540 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f  **apCell,      /
21550 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65  * Pointers to ce
21560 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69  ll bodies */.  i
21570 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20  nt *aSize       
21580 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65   /* Sizes of the
21590 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
215a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
215b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
215c0 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53   */.  int totalS
215d0 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ize;    /* Total
215e0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
215f0 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ls */.  int hdr;
21600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
21610 65 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ex of page heade
21620 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70  r */.  int cellp
21630 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tr;      /* Addr
21640 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
21650 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
21660 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
21670 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
21680 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
21690 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
216a0 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
216b0 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61  the page */..  a
216c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
216d0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
216e0 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
216f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
21700 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
21710 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
21720 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
21730 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
21740 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
21750 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
21760 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
21770 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
21780 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
21790 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
217a0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
217b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
217c0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
217d0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
217e0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
217f0 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
21800 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
21810 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
21820 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
21830 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
21840 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
21850 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
21860 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
21870 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
21880 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21890 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
218a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
218b0 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
218c0 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
218d0 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
218e0 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
218f0 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
21900 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
21910 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
21920 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
21930 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
21940 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
21950 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
21960 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
21970 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  ll = nCell;.}../
21980 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
21990 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
219a0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
219b0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
219c0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
219d0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
219e0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
219f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
21a00 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
21a10 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
21a20 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
21a30 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
21a40 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
21a50 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
21a60 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
21a70 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
21a80 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
21a90 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
21aa0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
21ab0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
21ac0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
21ad0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
21ae0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
21af0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
21b00 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
21b10 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
21b20 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
21b30 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
21b40 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
21b50 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
21b60 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
21b70 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
21b80 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
21b90 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
21ba0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
21bb0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
21bc0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
21bd0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
21be0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c00 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
21c10 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
21c20 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
21c30 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
21c40 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
21c50 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
21c60 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
21c70 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
21c80 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
21c90 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
21ca0 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23  mPage*, int);..#
21cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21cc0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
21cd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
21ce0 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
21cf0 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
21d00 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
21d10 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
21d20 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
21d30 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
21d40 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
21d50 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
21d60 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
21d70 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
21d80 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
21d90 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
21da0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
21db0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
21dc0 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65  f trying balance
21dd0 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
21de0 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
21df0 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
21e00 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
21e10 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
21e20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
21e30 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
21e40 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
21e50 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
21e60 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
21e70 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
21e80 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
21e90 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
21ea0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
21eb0 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
21ec0 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
21ed0 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
21ee0 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
21ef0 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
21f00 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
21f10 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
21f20 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
21f30 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
21f40 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
21f50 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
21f60 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
21f70 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
21f80 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
21f90 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
21fa0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
21fb0 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
21fc0 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
21fd0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
21fe0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
21ff0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
22000 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
22010 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
22020 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
22030 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20   Pgno pgnoNew;. 
22040 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e   u8 *pCell;.  in
22050 74 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c  t szCell;.  Cell
22060 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53  Info info;.  BtS
22070 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
22080 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70  ge->pBt;.  int p
22090 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65  arentIdx = pPare
220a0 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20  nt->nCell;   /* 
220b0 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69  pParent new divi
220c0 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  der cell index *
220d0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69  /.  int parentSi
220e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
220f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22100 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
22110 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74  l */.  u8 parent
22120 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20  Cell[64];       
22130 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
22140 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69  e for the new di
22150 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20  vider cell */.. 
22160 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
22170 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20  ew page. Insert 
22180 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
22190 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a  l from pPage.  *
221a0 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20  * into it. Then 
221b0 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66  remove the overf
221c0 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
221d0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  age..  */.  rc =
221e0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
221f0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
22200 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
22210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22220 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
22230 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c  n rc;.  }.  pCel
22240 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
22250 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43  [0].pCell;.  szC
22260 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
22270 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
22280 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77  .  zeroPage(pNew
22290 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
222a0 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61  ]);.  assemblePa
222b0 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
222c0 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20  ll, &szCell);.  
222d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
222e0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20   = 0;..  /* Set 
222f0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
22300 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  e newly allocate
22310 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e  d page to pParen
22320 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50  t. */.  pNew->pP
22330 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b  arent = pParent;
22340 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
22350 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
22360 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  age);..  /* pPag
22370 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  e is currently t
22380 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
22390 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67  f pParent. Chang
223a0 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74  e this.  ** so t
223b0 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  hat the right-ch
223c0 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20 70  ild is the new p
223d0 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62  age allocated ab
223e0 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61  ove and.  ** pPa
223f0 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74  ge is the next-t
22400 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a  o-right child. .
22410 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
22420 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
22430 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28  .  parseCellPtr(
22440 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
22450 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
22460 65 6c 6c 2d 31 29 2c 20 26 69 6e 66 6f 29 3b 0a  ell-1), &info);.
22470 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
22480 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
22490 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  tCell, 0, info.n
224a0 4b 65 79 2c 20 30 2c 20 30 2c 20 26 70 61 72 65  Key, 0, 0, &pare
224b0 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  ntSize);.  if( r
224c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
224d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
224e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61 72   }.  assert( par
224f0 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20  entSize<64 );.  
22500 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
22510 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
22520 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
22530 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
22540 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
22550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
22560 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
22570 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
22580 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
22590 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61  ,parentIdx), pPa
225a0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74  ge->pgno);.  put
225b0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
225c0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
225d0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
225e0 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20  oNew);..#ifndef 
225f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
22600 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74  VACUUM.  /* If t
22610 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
22620 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
22630 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
22640 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68  er map.  ** with
22650 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
22660 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
22670 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
22680 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f  the .  ** cell o
22690 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
226a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
226b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
226c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
226d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
226e0 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
226f0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
22700 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
22710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
22730 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
22740 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
22750 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20  vfl(pNew, 0);.  
22760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
22780 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22790 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
227a0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
227b0 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
227c0 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65  page and balance
227d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
227e0 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  ,.  ** in case t
227f0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
22800 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
22810 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
22820 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  rfull..  */.  re
22830 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
22840 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63  .  return balanc
22850 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d  e(pParent, 0);.}
22860 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22870 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
22880 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NCE */../*.** Th
22890 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 6d  e ISAUTOVACUUM m
228a0 61 63 72 6f 20 69 73 20 75 73 65 64 20 77 69 74  acro is used wit
228b0 68 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  hin balance_nonr
228c0 6f 6f 74 28 29 20 74 6f 20 64 65 74 65 72 6d 69  oot() to determi
228d0 6e 65 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  ne.** if the dat
228e0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
228f0 75 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e 6f  uto-vacuum or no
22900 74 2e 20 42 65 63 61 75 73 65 20 69 74 20 69 73  t. Because it is
22910 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20   used.** within 
22920 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
22930 61 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e  at is an argumen
22940 74 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61 63  t to another mac
22950 72 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d 61  ro .** (sqliteMa
22960 6c 6c 6f 63 52 61 77 29 2c 20 69 74 20 69 73 20  llocRaw), it is 
22970 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
22980 75 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  use conditional 
22990 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20  compilation..** 
229a0 53 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f 20 69  So, this macro i
229b0 73 20 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61  s defined instea
229c0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
229d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
229e0 43 55 55 4d 0a 23 64 65 66 69 6e 65 20 49 53 41  CUUM.#define ISA
229f0 55 54 4f 56 41 43 55 55 4d 20 28 70 42 74 2d 3e  UTOVACUUM (pBt->
22a00 61 75 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c 73  autoVacuum).#els
22a10 65 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f  e.#define ISAUTO
22a20 56 41 43 55 55 4d 20 30 0a 23 65 6e 64 69 66 0a  VACUUM 0.#endif.
22a30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
22a40 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
22a50 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  s Cells on pPage
22a60 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20   and up to NN*2 
22a70 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70  siblings.** of p
22a80 50 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c  Page so that all
22a90 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
22aa0 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e  t the same amoun
22ab0 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e  t of free space.
22ac0 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73  .** Usually NN s
22ad0 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65  iblings on eithe
22ae0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
22af0 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  is used in the b
22b00 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f  alancing,.** tho
22b10 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67  ugh more sibling
22b20 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
22b30 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50  m one side if pP
22b40 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
22b50 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  .** or last chil
22b60 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
22b70 20 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66    If pPage has f
22b80 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73  ewer than 2*NN s
22b90 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65  iblings.** (some
22ba0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
22bb0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70  only happen if p
22bc0 50 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  Page is the root
22bd0 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63   page or a .** c
22be0 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68  hild of root) th
22bf0 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  en all available
22c00 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63   siblings partic
22c10 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
22c20 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
22c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
22c40 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69  ings of pPage mi
22c50 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
22c60 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
22c70 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69   one or.** two i
22c80 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
22c90 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
22ca0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
22cb0 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f  er full. The roo
22cc0 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65  t page.** is spe
22cd0 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f  cial and is allo
22ce0 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79  wed to be nearly
22cf0 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65   empty. If pPage
22d00 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   is .** the root
22d10 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
22d20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65  depth of the tre
22d30 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
22d40 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65  ased.** or decre
22d50 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20  ased by one, as 
22d60 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65  necessary, to ke
22d70 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ep the root page
22d80 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f   from being.** o
22d90 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c  verfull or compl
22da0 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a  etely empty..**.
22db0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
22dc0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
22dd0 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
22de0 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70  f the Cells on p
22df0 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  Page.** might no
22e00 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
22e10 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61  ored in pPage->a
22e20 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61  Data[].  This ca
22e30 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
22e40 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
22e50 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68  ull.  Part of th
22e60 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
22e70 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d  utine is to.** m
22e80 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c  ake sure all Cel
22e90 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63  ls for pPage onc
22ea0 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70  e again fit in p
22eb0 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a  Page->aData[]..*
22ec0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
22ed0 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
22ee0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20  the siblings of 
22ef0 70 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e  pPage, the paren
22f00 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69  t of pPage.** mi
22f10 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66  ght become overf
22f20 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
22f30 2e 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65  .  If that happe
22f40 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ns, then this ro
22f50 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
22f60 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ed recursively o
22f70 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a  n the parent..**
22f80 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
22f90 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
22fa0 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
22fb0 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
22fc0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
22fd0 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20  rrupted state.  
22fe0 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
22ff0 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
23000 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
23010 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
23020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
23030 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d  alance_nonroot(M
23040 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
23050 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
23060 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nt;            /
23070 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20  * The parent of 
23080 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61  pPage */.  BtSha
23090 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
230a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
230b0 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
230c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
230d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
230e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
230f0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
23100 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
23110 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
23120 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
23130 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
23140 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
23150 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
23180 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
23190 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
231c0 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
231d0 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20  */.  int nDiv;  
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
23200 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20  ells in apDiv[] 
23210 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
23220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23230 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
23240 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b  rs */.  int idx;
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
23270 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e   pPage in pParen
23280 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
23290 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
232b0 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
232c0 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
232d0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
232e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
232f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
23300 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23310 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69  int leafCorrecti
23320 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
23330 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
23340 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
23350 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
23360 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
23370 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
23380 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
23390 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
233a0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
233b0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
233c0 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
233d0 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
233e0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
233f0 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
23400 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
23410 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
23420 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
23430 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
23440 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
23450 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
23460 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
23470 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20  */.  int iSpace 
23480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
23490 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
234a0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
234b0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
234c0 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
234d0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
234e0 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
234f0 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ings */.  Pgno p
23500 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  gnoOld[NB];     
23510 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
23520 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
23530 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  page in apOld[] 
23540 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
23550 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
23560 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
23570 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
23580 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
23590 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
235a0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
235b0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
235c0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
235d0 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  ncing */.  Pgno 
235e0 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  pgnoNew[NB+2];  
235f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
23600 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
23610 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d   page in apNew[]
23620 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
23630 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
23640 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
23650 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
23660 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
23670 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
23680 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
23690 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
236a0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
236b0 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
236c0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
236d0 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
236e0 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
236f0 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
23700 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
23710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23720 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
23730 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
23740 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  nt *szCell;     
23750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23760 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
23770 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
23780 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70  [] */.  u8 *aCop
23790 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  y[NB];          
237a0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
237b0 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
237c0 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
237d0 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20  u8 *aSpace;     
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
237f0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f  Space to hold co
23800 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
23810 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65   cells */.#ifnde
23820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23830 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61  TOVACUUM.  u8 *a
23840 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
23850 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
23860 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
23870 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
23880 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
23890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
238a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
238b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
238c0 61 67 65 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  age) );.  pBt = 
238d0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
238e0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
238f0 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
23900 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
23910 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
23920 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
23930 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
23940 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
23950 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23960 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
23970 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
23980 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
23990 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
239a0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
239b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
239c0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
239d0 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
239e0 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
239f0 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
23a00 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
23a10 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
23a20 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
23a30 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
23a40 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
23a50 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
23a60 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
23a70 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
23a80 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
23a90 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
23aa0 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
23ab0 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
23ac0 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
23ad0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
23ae0 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
23af0 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
23b00 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
23b10 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
23b20 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
23b30 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
23b40 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
23b50 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
23b60 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
23b70 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
23b80 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
23b90 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61        pPage->lea
23ba0 66 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70  fData &&.      p
23bb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
23bc0 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  =1 &&.      pPag
23bd0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
23be0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  =pPage->nCell &&
23bf0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
23c00 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
23c10 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
23c20 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
23c30 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
23c40 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
23c50 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  pgno.  ){.    /*
23c60 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68  .    ** TODO: Ch
23c70 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73  eck the siblings
23c80 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
23c90 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65  pPage. It may be
23ca0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
23cb0 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61  y are not full a
23cc0 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69  nd no new page i
23cd0 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
23ce0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61  */.    return ba
23cf0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67  lance_quick(pPag
23d00 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
23d10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
23d20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
23d30 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
23d40 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
23d50 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
23d60 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
23d70 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
23d80 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
23d90 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
23da0 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
23db0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
23dc0 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
23dd0 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
23de0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
23df0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
23e00 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a  nt->idxShift ){.
23e10 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
23e20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d     pgno = pPage-
23e30 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
23e40 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  t( pgno==sqlite3
23e50 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
23e60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
23e70 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30  );.    for(idx=0
23e80 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ; idx<pParent->n
23e90 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  Cell; idx++){.  
23ea0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
23eb0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
23ec0 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29  t, idx))==pgno )
23ed0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
23ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23ef0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
23f00 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20  Parent->nCell.  
23f10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65             || ge
23f20 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
23f30 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
23f40 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
23f50 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno );.  }else{.
23f60 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d      idx = pPage-
23f70 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  >idxParent;.  }.
23f80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69  .  /*.  ** Initi
23f90 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  alize variables 
23fa0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
23fb0 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a  be safe to jump.
23fc0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
23fd0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
23fe0 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a   at any moment..
23ff0 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e    */.  nOld = nN
24000 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
24010 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
24020 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
24030 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
24040 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
24050 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
24060 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
24070 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
24080 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
24090 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
240a0 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
240b0 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
240c0 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
240d0 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
240e0 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
240f0 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
24100 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
24110 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
24120 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
24130 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
24140 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
24150 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
24160 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
24170 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
24180 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
24190 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
241a0 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
241b0 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
241c0 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
241d0 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
241e0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
241f0 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
24200 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
24210 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
24220 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
24230 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
24240 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
24250 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
24260 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24270 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
24280 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
24290 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
242a0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
242b0 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
242c0 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
242d0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
242e0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
242f0 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
24300 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
24310 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
24320 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
24330 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
24340 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
24350 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24360 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24370 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
24380 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
24390 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
243a0 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
243b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
243c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
243d0 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
243e0 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
243f0 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
24400 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
24410 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
24420 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
24430 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
24440 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
24450 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
24460 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
24470 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
24480 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 2 in order to
24490 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
244a0 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
244b0 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
244c0 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29   (nMaxCells + 1)
244d0 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~1;..  /*.  ** 
244e0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
244f0 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
24500 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65  ures.  */.  apCe
24510 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
24520 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d  cRaw( .       nM
24530 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
24540 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24560 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
24570 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
24580 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20  of(int)         
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
245b0 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a      + ROUND8(siz
245c0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42  eof(MemPage))*NB
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a        /* aCopy *
245f0 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
24600 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20  geSize*(5+NB)   
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24620 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
24630 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  ce */.     + (IS
24640 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
24650 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20  xCells : 0)     
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24670 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20  aFrom */.  );.  
24680 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
24690 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
246a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
246b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
246c0 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
246d0 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e   (int*)&apCell[n
246e0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
246f0 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
24700 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
24710 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
24720 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[0] - (u8*)apC
24730 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
24740 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
24750 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
24760 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b    for(i=1; i<NB;
24770 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79   i++){.    aCopy
24780 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31  [i] = &aCopy[i-1
24790 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
247a0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
247b0 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73  mPage))];.    as
247c0 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d  sert( ((aCopy[i]
247d0 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
247e0 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
247f0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
24800 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
24810 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79   aSpace = &aCopy
24820 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
24830 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
24840 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
24850 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
24860 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  e - (u8*)apCell)
24870 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
24880 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
24890 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e  required */.#ifn
248a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
248b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
248c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
248d0 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20   ){.    aFrom = 
248e0 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70  &aSpace[5*pBt->p
248f0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65  ageSize];.  }.#e
24900 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  ndif.  .  /*.  *
24910 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
24920 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24930 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
24940 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
24950 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
24960 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
24970 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
24980 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
24990 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
249a0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
249b0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
249c0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
249d0 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
249e0 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
249f0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
24a00 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
24a10 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
24a20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
24a30 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
24a40 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70  age*)&aCopy[i][p
24a50 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
24a60 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
24a70 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
24a80 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d  geSize];.    mem
24a90 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
24aa0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
24ab0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73  Bt->pageSize + s
24ac0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
24ad0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63  .    /* The memc
24ae0 70 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67  py() above chang
24af0 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
24b00 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68  p->aData so we h
24b10 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ave to.    ** se
24b20 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  t it again. */. 
24b30 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28     p->aData = &(
24b40 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61  (u8*)p)[-pBt->pa
24b50 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20  geSize];.  }..  
24b60 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
24b70 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
24b80 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
24b90 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
24ba0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
24bb0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
24bc0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
24bd0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
24be0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
24bf0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
24c00 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
24c10 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
24c20 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
24c30 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
24c40 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
24c50 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
24c60 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
24c70 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
24c80 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
24c90 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
24ca0 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
24cb0 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
24cc0 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
24cd0 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
24ce0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
24cf0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
24d00 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
24d10 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
24d20 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
24d30 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
24d40 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
24d50 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
24d60 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
24d70 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
24d80 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
24d90 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
24da0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
24db0 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
24dc0 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
24dd0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
24de0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
24df0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
24e00 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
24e10 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
24e20 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
24e30 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
24e40 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
24e50 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
24e60 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
24e70 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
24e80 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
24e90 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
24ea0 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
24eb0 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
24ec0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
24ed0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
24ee0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
24ef0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
24f00 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
24f10 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
24f20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
24f30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
24f40 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
24f50 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
24f60 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
24f70 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
24f80 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
24f90 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
24fa0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
24fb0 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
24fc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24fd0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
24fe0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
24ff0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25000 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
25010 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
25020 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
25030 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
25040 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
25050 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
25060 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
25070 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
25080 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
25090 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
250a0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
250b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
250c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
250d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
250e0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
250f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
25100 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ld-1 ){.      in
25110 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  t sz = cellSizeP
25120 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
25130 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
25140 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
25150 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
25160 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
25170 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
25180 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
25190 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
251a0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
251b0 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
251c0 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
251d0 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
251e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
251f0 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
25200 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
25210 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
25220 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
25230 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
25240 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
25250 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
25260 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
25270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25280 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
25290 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
252a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
252b0 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
252c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
252d0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
252e0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
252f0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
25300 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
25310 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
25320 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
25330 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
25340 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
25350 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
25360 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
25370 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
25380 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
25390 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
253a0 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
253b0 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  tion;.#ifndef SQ
253c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
253d0 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
253e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
253f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
25400 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
25410 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  F;.        }.#en
25420 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70  dif.        drop
25430 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
25440 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
25450 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
25460 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
25470 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
25480 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
25490 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
254a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
254b0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
254c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
254d0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
254e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
254f0 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
25500 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
25510 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
25520 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
25530 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
25540 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
25550 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
25560 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
25570 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
25580 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
25590 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
255a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
255b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
255c0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
255d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
255e0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
255f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25600 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
25610 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
25620 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
25630 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
25640 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
25650 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
25660 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
25670 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
25680 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
25690 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
256a0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
256b0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
256c0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
256d0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
256e0 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
256f0 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
25700 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
25710 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
25720 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
25730 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
25740 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
25750 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
25760 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
25770 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
25780 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
25790 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
257a0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
257b0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
257c0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
257d0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
257e0 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
257f0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
25800 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
25810 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
25820 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
25830 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
25840 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
25850 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
25860 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
25870 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
25880 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
25890 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
258a0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
258b0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
258c0 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
258d0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
258e0 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
258f0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
25900 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
25910 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
25920 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
25930 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
25940 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
25950 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
25960 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
25970 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
25980 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
25990 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
259a0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
259b0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
259c0 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
259d0 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
259e0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
259f0 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
25a00 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
25a10 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
25a20 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
25a30 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
25a40 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
25a50 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
25a60 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
25a70 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
25a80 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
25a90 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
25aa0 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
25ab0 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
25ac0 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
25ad0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
25ae0 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
25af0 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
25b00 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
25b10 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
25b20 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
25b30 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
25b40 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
25b50 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
25b60 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
25b70 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
25b80 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
25b90 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
25ba0 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
25bb0 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
25bc0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
25bd0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
25be0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
25bf0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
25c00 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
25c10 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
25c20 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
25c30 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
25c40 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
25c50 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
25c60 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
25c70 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
25c80 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
25c90 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
25ca0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
25cb0 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
25cc0 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
25cd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25ce0 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
25cf0 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
25d00 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d20 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
25d30 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
25d40 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
25d50 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
25d60 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
25d70 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
25d80 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
25d90 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
25da0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25db0 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
25dc0 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
25dd0 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
25de0 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
25df0 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
25e00 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
25e10 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
25e20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
25e30 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
25e40 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
25e50 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
25e60 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
25e70 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
25e80 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
25e90 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
25ea0 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
25eb0 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
25ec0 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
25ed0 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
25ee0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
25ef0 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
25f00 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
25f10 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
25f20 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
25f30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
25f40 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
25f50 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
25f60 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
25f70 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
25f80 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
25f90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25fa0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
25fb0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
25fc0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
25fd0 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
25fe0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
25ff0 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
26000 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
26010 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
26020 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26030 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
26040 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
26050 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
26060 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
26070 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
26080 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
26090 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
260a0 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
260b0 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
260c0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
260d0 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
260e0 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
260f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26100 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
26110 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
26120 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
26130 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
26140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
26150 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
26160 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
26170 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
26180 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69  pNew, &pgnoNew[i
26190 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c  ], pgnoNew[i-1],
261a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
261b0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
261c0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
261d0 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
261e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4e 65 77 2b  .    }.    nNew+
261f0 2b 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  +;.    zeroPage(
26200 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
26210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
26220 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
26230 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
26240 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
26250 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
26260 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
26270 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
26280 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
26290 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
262a0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
262b0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
262c0 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
262d0 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
262e0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
262f0 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
26300 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
26310 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
26320 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
26330 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
26340 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
26350 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
26360 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
26370 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
26380 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
26390 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
263a0 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
263b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
263c0 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
263d0 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
263e0 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
263f0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
26400 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
26410 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
26420 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
26430 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
26440 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
26450 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
26460 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
26470 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
26480 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
26490 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
264a0 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
264b0 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
264c0 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
264d0 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
264e0 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
264f0 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
26500 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
26510 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
26520 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e    int minV = pgn
26530 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  oNew[i];.    int
26540 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
26550 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
26560 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
26570 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67  gnoNew[j]<(unsig
26580 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
26590 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
265a0 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e        minV = pgn
265b0 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  oNew[j];.      }
265c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
265d0 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
265e0 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
265f0 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
26600 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
26610 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
26620 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
26630 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d  w[i] = pgnoNew[m
26640 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
26650 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
26660 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  I];.      pgnoNe
26670 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20  w[minI] = t;.   
26680 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
26690 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
266a0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
266b0 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
266c0 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28   new: %d(%d) %d(
266d0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
266e0 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
266f0 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20   pgnoOld[0], .  
26700 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f    nOld>=2 ? pgno
26710 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[1] : 0,.    
26720 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c  nOld>=3 ? pgnoOl
26730 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67  d[2] : 0,.    pg
26740 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b  noNew[0], szNew[
26750 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
26760 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30  ? pgnoNew[1] : 0
26770 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
26780 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
26790 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=3 ? pgnoNew[
267a0 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  2] : 0, nNew>=3 
267b0 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
267c0 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67      nNew>=4 ? pg
267d0 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e  noNew[3] : 0, nN
267e0 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
267f0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
26800 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a  5 ? pgnoNew[4] :
26810 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
26820 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
26830 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
26840 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
26850 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
26860 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
26870 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
26880 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
26890 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
268a0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
268b0 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
268c0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
268d0 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
268e0 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
268f0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
26900 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
26910 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
26920 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
26930 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26940 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  pNew->pgno==pgno
26950 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73  New[i] );.    as
26960 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
26970 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
26980 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
26990 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
269a0 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
269b0 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
269c0 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
269d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
269e0 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
269f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
26a00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26a10 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  UM.    /* If thi
26a20 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
26a30 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
26a40 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
26a50 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20   map entries.   
26a60 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
26a70 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  o the siblings t
26a80 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e  hat were rearran
26a90 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62  ged. These can b
26aa0 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63  e: left.    ** c
26ab0 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73  hildren of cells
26ac0 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  , the right-chil
26ad0 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f  d of the page, o
26ae0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
26af0 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  .    ** pointed 
26b00 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20  to by cells..   
26b10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
26b20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
26b30 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c       for(k=j; k<
26b40 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b  cntNew[i]; k++){
26b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26b60 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   k<nMaxCells );.
26b70 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f          if( aFro
26b80 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70  m[k]==0xFF || ap
26b90 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e  Copy[aFrom[k]]->
26ba0 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
26bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
26bc0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
26bd0 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20  (pNew, k-j);.   
26be0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26c00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
26c10 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
26c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26c30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26c40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20  }.#endif..    j 
26c50 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
26c60 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
26c70 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
26c80 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
26c90 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
26ca0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
26cb0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
26cc0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
26cd0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
26ce0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
26cf0 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
26d00 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
26d10 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
26d20 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
26d30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
26d40 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
26d50 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
26d60 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
26d70 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
26d80 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
26d90 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
26da0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
26db0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
26dc0 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
26dd0 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  4);.        pTem
26de0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
26df0 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
26e00 29 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20 74 72  ){../* If the tr
26e10 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
26e20 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
26e30 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
26e40 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
26e50 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
26e60 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
26e70 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
26e80 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
26e90 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
26ea0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
26eb0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
26ec0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
26ed0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
26ee0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
26ef0 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
26f00 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
26f10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
26f20 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
26f30 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
26f40 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28     parseCellPtr(
26f50 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c  pNew, apCell[j],
26f60 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
26f70 20 70 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65   pCell = &aSpace
26f80 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  [iSpace];.      
26f90 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61    fillInCell(pPa
26fa0 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20  rent, pCell, 0, 
26fb0 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
26fc0 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69   &sz);.        i
26fd0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
26fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
26ff0 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
27000 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ze*5 );.        
27010 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
27020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27030 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
27040 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
27050 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20  ace[iSpace];.   
27060 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73       iSpace += s
27070 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  z;.        asser
27080 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e  t( iSpace<=pBt->
27090 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20  pageSize*5 );.  
270a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
270b0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
270c0 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
270d0 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
270e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
270f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27100 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
27110 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
27120 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
27130 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
27140 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23  , pNew->pgno);.#
27150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27160 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
27170 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
27180 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
27190 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
271a0 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
271b0 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
271c0 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
271d0 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
271e0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
271f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
27200 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
27210 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
27220 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
27230 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
27240 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
27250 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65  utoVacuum && !le
27260 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
27270 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
27280 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
27290 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
272a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
272b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
272c0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
272d0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
272e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
272f0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
27300 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
27310 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
27320 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27330 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
27340 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
27350 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
27360 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
27370 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
27380 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
27390 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f  a[8], &apCopy[nO
273a0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ld-1]->aData[8],
273b0 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   4);.  }.  if( n
273c0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
273d0 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
273e0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
273f0 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
27400 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
27410 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
27420 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
27430 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
27440 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
27450 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
27460 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
27470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
27480 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
27490 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
274a0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
274b0 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
274c0 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
274d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
274e0 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
274f0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
27500 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
27510 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
27520 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
27530 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27540 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65  Reparent childre
27550 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a  n of all cells..
27560 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
27570 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
27580 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
27590 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b  hildPages(apNew[
275a0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
275b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
275c0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
275d0 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65  p;.  }.  rc = re
275e0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
275f0 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  (pParent);.  if(
27600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27610 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27620 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  eanup;..  /*.  *
27630 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
27640 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
27650 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
27660 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
27670 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
27680 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
27690 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
276a0 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
276b0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
276c0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
276d0 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
276e0 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
276f0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
27700 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
27710 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62 61  nit );.  rc = ba
27720 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30  lance(pParent, 0
27730 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
27740 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
27750 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
27760 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
27770 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 43    sqliteFree(apC
27780 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
27790 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
277a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
277b0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
277c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
277d0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
277e0 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
277f0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
27800 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20  age(pParent);.  
27810 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
27820 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25   finished with %
27830 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
27840 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
27850 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
27860 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c  gno, nOld, nNew,
27870 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75   nCell));.  retu
27880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27890 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
278a0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72  called for the r
278b0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74  oot page of a bt
278c0 72 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  ree when the roo
278d0 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  t.** page contai
278e0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68  ns no cells.  Th
278f0 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75  is is an opportu
27900 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65  nity to make the
27910 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77   tree.** shallow
27920 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e  er by one level.
27930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
27940 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
27950 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
27960 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  {.  MemPage *pCh
27970 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
27980 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69   /* The only chi
27990 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61 67 65  ld page of pPage
279a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
279b0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
279c0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
279d0 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a  r for pChild */.
279e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
279f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
27a00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
27a10 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
27a20 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
27a30 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
27a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
27a50 6e 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  n BTree structur
27a60 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c  e */.  int mxCel
27a70 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20  lPerPage;       
27a80 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
27a90 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70  umber of cells p
27aa0 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  er page */.  u8 
27ab0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
27ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
27ad0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65   cells from page
27ae0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
27af0 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c   */.  int *szCel
27b00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
27b10 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
27b20 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
27b30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27b40 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
27b50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27b60 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
27b70 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
27b80 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
27b90 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
27ba0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
27bb0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78  iteMallocRaw( mx
27bc0 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a  CellPerPage*(siz
27bd0 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28  eof(u8*)+sizeof(
27be0 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28 20 61  int)) );.  if( a
27bf0 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pCell==0 ) retur
27c00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
27c10 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
27c20 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50  )&apCell[mxCellP
27c30 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70  erPage];.  if( p
27c40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
27c50 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
27c60 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
27c70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28  ty */.    TRACE(
27c80 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79  ("BALANCE: empty
27c90 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50   table %d\n", pP
27ca0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
27cb0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
27cc0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
27cd0 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20  pty but has one 
27ce0 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72  child.  Transfer
27cf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f   the.    ** info
27d00 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
27d10 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
27d20 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
27d30 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  f it .    ** wil
27d40 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
27d50 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
27d60 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
27d70 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
27d80 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
27d90 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20  e is page 1, it 
27da0 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61  has less space a
27db0 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20  vailable than.  
27dc0 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28    ** its child (
27dd0 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62  due to the 100 b
27de0 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20  yte header that 
27df0 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65  occurs at the be
27e00 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
27e10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
27e20 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74  le), so it might
27e30 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
27e40 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  hold all of the 
27e50 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
27e60 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
27e70 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
27e80 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
27e90 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  s the .    ** ca
27ea0 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  se, then do not 
27eb0 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e  do the transfer.
27ec0 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65    Leave page 1 e
27ed0 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20  mpty except.    
27ee0 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
27ef0 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
27f00 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
27f10 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
27f20 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  mes.    ** the v
27f30 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
27f40 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a  he tree..    */.
27f50 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
27f60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
27f70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
27f80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
27f90 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
27fa0 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ld>0 );.    asse
27fb0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73  rt( pgnoChild<=s
27fc0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
27fd0 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d  ount(pPage->pBt-
27fe0 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  >pPager) );.    
27ff0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 50 61  rc = getPage(pPa
28000 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69  ge->pBt, pgnoChi
28010 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b  ld, &pChild, 0);
28020 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28030 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
28040 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20  alance;.    if( 
28050 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pPage->pgno==1 )
28060 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 69  {.      rc = ini
28070 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
28080 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
28090 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
280a0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
280b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
280c0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ild->nOverflow==
280d0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
280e0 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30  Child->nFree>=10
280f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
28100 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d  The child inform
28110 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f  ation will fit o
28120 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  n the root page,
28130 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20   so do the.     
28140 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20     ** copy */.  
28150 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
28160 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50       zeroPage(pP
28170 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
28180 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[0]);.        
28190 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
281a0 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
281b0 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c            apCell
281c0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
281d0 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20  Child,i);.      
281e0 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20      szCell[i] = 
281f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69  cellSizePtr(pChi
28200 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a  ld, apCell[i]);.
28210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28220 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
28230 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43  Page, pChild->nC
28240 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43  ell, apCell, szC
28250 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ell);.        /*
28260 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d   Copy the right-
28270 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
28280 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65  hild to the pare
28290 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  nt. */.        p
282a0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
282b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
282c0 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20  Offset+8], .    
282d0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
282e0 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  (&pChild->aData[
282f0 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65  pChild->hdrOffse
28300 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  t+8]));.        
28310 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
28320 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
28330 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
28340 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20   %d transfer to 
28350 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
28360 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
28370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28380 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
28390 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
283a0 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
283b0 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
283c0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65       ** The tree
283d0 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61   is already bala
283e0 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e  nced.  Do nothin
283f0 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52  g. */.        TR
28400 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
28410 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74  hild %d will not
28420 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e   fit on page 1\n
28430 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
28440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28450 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
28460 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  py(pPage->aData,
28470 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20   pChild->aData, 
28480 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
28490 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  leSize);.      p
284a0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
284b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
284c0 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
284d0 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28    rc = initPage(
284e0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  pPage, 0);.     
284f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28500 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
28510 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
28520 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
28530 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65  BALANCE: transfe
28540 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20  r child %d into 
28550 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20  root %d\n",.    
28560 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64            pChild
28570 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70  ->pgno, pPage->p
28580 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
28590 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68   rc = reparentCh
285a0 69 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b  ildPages(pPage);
285b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
285c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
285d0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
285e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
285f0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
28600 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
28610 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
28620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
28630 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20  e->nCell; i++){ 
28640 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
28650 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67  rmapPutOvfl(pPag
28660 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  e, i);.        i
28670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
28690 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
286a0 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20  alance;.        
286b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
286c0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
286d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
286e0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
286f0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c  balance;.    rel
28700 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
28710 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f  ;.  }.end_shallo
28720 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c  w_balance:.  sql
28730 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  iteFree(apCell);
28740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28750 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
28760 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
28770 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  l.**.** When thi
28780 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74  s happens, Creat
28790 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  e a new child pa
287a0 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a  ge and copy the.
287b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
287c0 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65  he root into the
287d0 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61   child.  Then ma
287e0 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  ke the root.** p
287f0 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67  age an empty pag
28800 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c  e with rightChil
28810 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  d pointing to th
28820 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20  e new.** child. 
28830 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20    Finally, call 
28840 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c  balance_internal
28850 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68  () on the new ch
28860 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20  ild.** to cause 
28870 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a  it to split..*/.
28880 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
28890 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67  ce_deeper(MemPag
288a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
288b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
288c0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
288d0 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
288e0 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
288f0 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20   *pChild;    /* 
28900 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  Pointer to a new
28910 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
28920 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
28930 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
28940 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
28950 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
28960 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
28970 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
28980 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
28990 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54  leSize;     /* T
289a0 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65  otal usable size
289b0 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   of a page */.  
289c0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
289d0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
289e0 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
289f0 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61  e */.  u8 *cdata
28a00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
28a10 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69  ntent of the chi
28a20 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ld page */.  int
28a30 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
28a40 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61   /* Offset to pa
28a50 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72  ge header in par
28a60 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ent */.  int brk
28a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
28a80 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e  Offset to conten
28a90 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  t of first cell 
28aa0 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20  in parent */..  
28ab0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
28ac0 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
28ad0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
28ae0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70  verflow>0 );.  p
28af0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
28b00 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
28b10 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
28b20 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69  pChild, &pgnoChi
28b30 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ld, pPage->pgno,
28b40 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
28b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
28b60 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28b70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
28b80 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
28b90 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
28ba0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
28bb0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
28bc0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
28bd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28be0 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
28bf0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
28c00 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69  ;.  cdata = pChi
28c10 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d  ld->aData;.  mem
28c20 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61  cpy(cdata, &data
28c30 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65  [hdr], pPage->ce
28c40 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
28c50 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20  ->nCell-hdr);.  
28c60 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72  memcpy(&cdata[br
28c70 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
28c80 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b  usableSize-brk);
28c90 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
28ca0 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  d->isInit==0 );.
28cb0 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28    rc = initPage(
28cc0 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a  pChild, pPage);.
28cd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28ce0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
28cf0 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69  t;.  memcpy(pChi
28d00 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
28d10 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
28d20 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
28d30 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
28d40 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f  ));.  pChild->nO
28d50 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d  verflow = pPage-
28d60 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66  >nOverflow;.  if
28d70 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66  ( pChild->nOverf
28d80 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c  low ){.    pChil
28d90 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
28da0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  }.  assert( pChi
28db0 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
28dc0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72  ->nCell );.  zer
28dd0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
28de0 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20  ild->aData[0] & 
28df0 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75  ~PTF_LEAF);.  pu
28e00 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28e10 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28e20 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68  ffset+8], pgnoCh
28e30 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ild);.  TRACE(("
28e40 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
28e50 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
28e60 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
28e70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23  Child->pgno));.#
28e80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28e90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
28ea0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28eb0 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uum ){.    int i
28ec0 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
28ed0 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64  pPut(pBt, pChild
28ee0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
28ef0 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e  TREE, pPage->pgn
28f00 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
28f10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65   goto balancedee
28f20 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72  per_out;.    for
28f30 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
28f40 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
28f50 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28f60 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29  tOvfl(pChild, i)
28f70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
28f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28f90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28fb0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
28fc0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
28fd0 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63  pChild);..balanc
28fe0 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72  edeeper_out:.  r
28ff0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
29000 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
29010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65  .}../*.** Decide
29020 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61   if the page pPa
29030 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ge needs to be b
29040 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c  alanced.  If bal
29050 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71  ancing is.** req
29060 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20  uired, call the 
29070 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61  appropriate bala
29080 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a  ncing routine..*
29090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
290a0 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  ance(MemPage *pP
290b0 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29  age, int insert)
290c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
290d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
290e0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
290f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
29100 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
29110 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
29120 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
29130 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29150 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
29160 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
29170 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
29180 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
29190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
291a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
291b0 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
291c0 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67  (!insert && pPag
291d0 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e  e->nFree>pPage->
291e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
291f0 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63  2/3) ){.      rc
29200 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
29210 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ot(pPage);.    }
29220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29240 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61  routine checks a
29250 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ll cursors that 
29260 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70  point to table p
29270 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61  gnoRoot..** If a
29280 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73  ny of those curs
29290 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20  ors were opened 
292a0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69  with wrFlag==0 i
292b0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  n a different.**
292c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
292d0 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65  tion (a database
292e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
292f0 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65   shares the page
29300 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20  r.** cache with 
29310 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e  the current conn
29320 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74  ection) and that
29330 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
29340 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20  n .** is not in 
29350 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69  the ReadUncommmi
29360 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e  tted state, then
29370 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
29380 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
29390 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49  _LOCKED..**.** I
293a0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68  n addition to ch
293b0 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d  ecking for read-
293c0 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20 72  locks (where a r
293d0 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61  ead-lock .** mea
293e0 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e  ns a cursor open
293f0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
29400 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0) this routine 
29410 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c  also moves.** al
29420 6c 20 63 75 72 73 6f 72 73 20 77 72 69 74 65 20  l cursors write 
29430 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20  cursors so that 
29440 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
29450 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72  g to the .** fir
29460 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72  st Cell on the r
29470 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  oot page.  This 
29480 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
29490 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a  ause an insert .
294a0 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67  ** or delete mig
294b0 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75  ht change the nu
294c0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
294d0 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74   a page or delet
294e0 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69  e.** a page enti
294f0 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e  rely and we do n
29500 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65  ot want to leave
29510 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a   any cursors .**
29520 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e   pointing to non
29530 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65 73 20  -existant pages 
29540 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  or cells..*/.sta
29550 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
29560 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42  dLocks(Btree *pB
29570 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52  tree, Pgno pgnoR
29580 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
29590 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75  Exclude){.  BtCu
295a0 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
295b0 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
295c0 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
295d0 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
295e0 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f 72 28 70  pSqlite;.  for(p
295f0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
29600 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
29610 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75     if( p==pExclu
29620 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
29630 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
29640 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
29650 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
29660 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
29670 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69  pgnoRoot ) conti
29680 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
29690 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  wrFlag==0 ){.   
296a0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74     sqlite3 *dbOt
296b0 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d  her = p->pBtree-
296c0 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20  >pSqlite;.      
296d0 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c  if( dbOther==0 |
296e0 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62 4f 74  |.         (dbOt
296f0 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74  her!=db && (dbOt
29700 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  her->flags & SQL
29710 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
29720 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  ted)==0) ){.    
29730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29740 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
29750 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
29760 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  p->pPage->pgno!=
29770 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  p->pgnoRoot ){. 
29780 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28       moveToRoot(
29790 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
297a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
297b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
297c0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
297d0 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
297e0 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
297f0 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
29800 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
29810 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
29820 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
29830 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
29840 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
29850 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
29860 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
29870 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
29880 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
29890 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
298a0 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
298b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
298c0 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
298d0 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
298e0 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
298f0 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
29900 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
29910 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
29920 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
29930 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
29940 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  h ignored..*/.in
29950 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
29960 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72  sert(.  BtCursor
29970 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
29980 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
29990 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74   data into the t
299a0 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72  able of this cur
299b0 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  sor */.  const v
299c0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
299d0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
299e0 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ey of the new re
299f0 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
29a00 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
29a10 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20   nData,  /* The 
29a20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20  data of the new 
29a30 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
29a40 61 70 70 65 6e 64 42 69 61 73 20 20 20 20 20 20  appendBias      
29a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29a60 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
29a70 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
29a80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
29a90 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20   int loc;.  int 
29aa0 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65  szNew;.  MemPage
29ab0 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61   *pPage;.  BtSha
29ac0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
29ad0 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20  >pBtree->pBt;.  
29ae0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
29af0 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
29b00 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
29b10 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 42 74   = 0;..  if( pBt
29b20 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
29b30 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
29b40 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
29b50 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
29b60 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20  before doing an 
29b70 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65  insert */.    re
29b80 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
29b90 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
29ba0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
29bb0 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
29bc0 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
29bd0 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72  y );.  if( !pCur
29be0 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
29bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
29c00 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  RM;   /* Cursor 
29c10 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69  not open for wri
29c20 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
29c30 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
29c40 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
29c50 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
29c60 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
29c70 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
29c80 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
29c90 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
29ca0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
29cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
29cc0 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
29cd0 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
29ce0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
29cf0 74 61 62 6c 65 20 2a 2f 0a 20 20 72 65 73 74 6f  table */.  resto
29d00 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
29d10 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29  osition(pCur, 0)
29d20 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
29d30 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
29d40 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
29d50 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
29d60 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
29d70 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
29d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
29d90 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
29da0 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
29db0 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
29dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29dd0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
29de0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
29df0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
29e00 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
29e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29e20 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
29e30 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52  leafData );.  TR
29e40 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
29e50 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
29e60 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
29e70 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
29e80 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
29e90 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
29ea0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
29eb0 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
29ec0 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
29ed0 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
29ee0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
29ef0 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73  Init );.  rc = s
29f00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29f10 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29f20 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
29f30 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c  urn rc;.  newCel
29f40 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
29f50 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  Raw( MX_CELL_SIZ
29f60 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20  E(pBt) );.  if( 
29f70 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
29f80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
29f90 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
29fa0 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
29fb0 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
29fc0 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73  pData, nData, &s
29fd0 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
29fe0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
29ff0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
2a000 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
2a010 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
2a020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
2a030 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
2a040 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c  (pBt) );.  if( l
2a050 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2a060 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2a070 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ate ){.    int s
2a080 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2a090 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
2a0a0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
2a0b0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2a0c0 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
2a0d0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2a0e0 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
2a0f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2a100 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
2a110 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
2a120 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
2a130 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2a140 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2a150 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2a160 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
2a170 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2a180 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2a190 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2a1a0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2a1b0 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65   szOld);.  }else
2a1c0 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
2a1d0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
2a1e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a1f0 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70  e->leaf );.    p
2a200 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20  Cur->idx++;.    
2a210 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a220 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2a230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a240 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
2a250 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2a260 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2a270 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
2a280 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2a290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2a2a0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2a2b0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2a2c0 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73  Page, 1);.  /* s
2a2d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
2a2e0 75 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70  ump(pCur->pBt, p
2a2f0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31  Cur->pgnoRoot, 1
2a300 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73  ); */.  /* fflus
2a310 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
2a320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a330 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2a340 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65  oot(pCur);.  }.e
2a350 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c  nd_insert:.  sql
2a360 69 74 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29  iteFree(newCell)
2a370 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2a380 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2a390 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
2a3a0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
2a3b0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
2a3c0 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2a3d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2a3e0 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2a3f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a400 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
2a410 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2a420 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2a430 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69  r->pPage;.  unsi
2a440 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2a450 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
2a460 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
2a470 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2a480 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
2a490 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2a4a0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2a4b0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
2a4c0 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2a4d0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2a4e0 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2a4f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
2a500 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74  re doing a delet
2a510 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
2a520 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2a530 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2a540 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2a550 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2a560 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2a570 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20    if( pCur->idx 
2a580 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  >= pPage->nCell 
2a590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a5a0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
2a5b0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
2a5c0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
2a5d0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
2a5e0 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2a5f0 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2a600 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2a610 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74  * Did not open t
2a620 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77  his cursor for w
2a630 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2a640 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2a650 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2a660 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a670 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65   pCur) ){.    re
2a680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2a690 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2a6a0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2a6b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2a6c0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2a6d0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2a6e0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2a6f0 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2a700 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2a710 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2a720 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2a730 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2a740 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2a750 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2a760 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2a770 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2a780 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2a790 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2a7a0 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2a7b0 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2a7c0 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2a7d0 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2a7e0 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43  (rc = restoreOrC
2a7f0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2a800 6f 6e 28 70 43 75 72 2c 20 31 29 29 21 3d 30 20  on(pCur, 1))!=0 
2a810 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76  ||.    (rc = sav
2a820 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2a830 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a840 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20   pCur))!=0 ||.  
2a850 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50    (rc = sqlite3P
2a860 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2a870 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20  >pDbPage))!=0.  
2a880 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2a890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
2a8a0 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  te the cell with
2a8b0 69 6e 20 69 74 27 73 20 70 61 67 65 20 61 6e 64  in it's page and
2a8c0 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69   leave pCell poi
2a8d0 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a  nting to the.  *
2a8e0 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61  * data. The clea
2a8f0 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65  rCell() call fre
2a900 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  es any overflow 
2a910 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2a920 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63   with the.  ** c
2a930 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74  ell. The cell it
2a940 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e  self is still in
2a950 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65  tact..  */.  pCe
2a960 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2a970 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b  age, pCur->idx);
2a980 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2a990 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43  eaf ){.    pgnoC
2a9a0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2a9b0 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63  pCell);.  }.  rc
2a9c0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
2a9d0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66  ge, pCell);.  if
2a9e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2a9f0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
2aa00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
2aa10 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
2aa20 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2aa30 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
2aa40 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
2aa50 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
2aa60 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
2aa70 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
2aa80 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
2aa90 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
2aaa0 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
2aab0 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
2aac0 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
2aad0 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
2aae0 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
2aaf0 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
2ab00 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
2ab10 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
2ab20 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
2ab30 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
2ab40 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
2ab50 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
2ab60 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Cur;.    unsigne
2ab70 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20  d char *pNext;. 
2ab80 20 20 20 69 6e 74 20 73 7a 4e 65 78 74 3b 20 20     int szNext;  
2ab90 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c 65 72 20  /* The compiler 
2aba0 77 61 72 6e 69 6e 67 20 69 73 20 77 72 6f 6e 67  warning is wrong
2abb0 3a 20 73 7a 4e 65 78 74 20 69 73 20 61 6c 77 61  : szNext is alwa
2abc0 79 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ys .            
2abd0 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
2abe0 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20  zed before use. 
2abf0 20 41 64 64 69 6e 67 20 61 6e 20 65 78 74 72 61   Adding an extra
2ac00 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20 74   ** to silence t
2ac30 68 65 20 63 6f 6d 70 69 6c 65 72 20 73 6c 6f 77  he compiler slow
2ac40 73 20 64 6f 77 6e 20 74 68 65 20 63 6f 64 65 2e  s down the code.
2ac50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55   */.    int notU
2ac60 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  sed;.    unsigne
2ac70 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c  d char *tempCell
2ac80 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2ac90 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  ( !pPage->leafDa
2aca0 74 61 20 29 3b 0a 20 20 20 20 67 65 74 54 65 6d  ta );.    getTem
2acb0 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c  pCursor(pCur, &l
2acc0 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20  eafCur);.    rc 
2acd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
2ace0 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f  xt(&leafCur, &no
2acf0 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
2ad00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ad10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ad20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
2ad30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2ad40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ad50 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
2ad60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ad70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ad80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ad90 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50  Write(leafCur.pP
2ada0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2adb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2adc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2add0 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
2ade0 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
2adf0 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f  ete internal fro
2ae00 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f  m %d replace fro
2ae10 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
2ae20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
2ae30 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
2ae40 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67  no, leafCur.pPag
2ae50 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  e->pgno));.     
2ae60 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2ae70 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c   pCur->idx, cell
2ae80 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2ae90 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e  Cell));.      pN
2aea0 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c  ext = findCell(l
2aeb0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65  eafCur.pPage, le
2aec0 61 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20  afCur.idx);.    
2aed0 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53    szNext = cellS
2aee0 69 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70  izePtr(leafCur.p
2aef0 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20  Page, pNext);.  
2af00 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
2af10 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73  ELL_SIZE(pBt)>=s
2af20 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20  zNext+4 );.     
2af30 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69   tempCell = sqli
2af40 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f  teMallocRaw( MX_
2af50 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
2af60 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
2af70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
2af80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2af90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2afa0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2afb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2afc0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
2afd0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2afe0 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a  idx, pNext-4, sz
2aff0 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c  Next+4, tempCell
2b000 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2b010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b020 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  K ){.      put4b
2b030 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2b040 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b050 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c  ->idx), pgnoChil
2b060 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62  d);.      rc = b
2b070 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2b080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b0a0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
2b0b0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c  leafCur.pPage, l
2b0c0 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65  eafCur.idx, szNe
2b0d0 78 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xt);.      rc = 
2b0e0 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e  balance(leafCur.
2b0f0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pPage, 0);.    }
2b100 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2b110 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 72  tempCell);.    r
2b120 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
2b130 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65  (&leafCur);.  }e
2b140 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28  lse{.    TRACE((
2b150 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2b160 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65  d delete from le
2b170 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
2b180 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2b190 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2b1a0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2b1b0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2b1c0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2b1d0 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72  , pCell));.    r
2b1e0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2b1f0 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e, 0);.  }.  if(
2b200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b210 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
2b220 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
2b230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b240 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
2b250 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
2b260 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
2b270 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
2b280 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
2b290 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
2b2a0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
2b2b0 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
2b2c0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
2b2d0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2b2e0 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
2b2f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
2b300 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
2b310 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
2b320 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
2b330 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
2b340 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
2b350 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
2b360 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
2b370 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
2b380 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
2b390 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
2b3a0 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3c0 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
2b3d0 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74 20 73 71  ndices.*/.int sq
2b3e0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
2b3f0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2b400 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
2b410 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
2b420 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2b430 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
2b440 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
2b450 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
2b460 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2b470 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2b480 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2b490 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2b4a0 61 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20  ansaction first 
2b4b0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2b4c0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2b4d0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2b4e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b4f0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2b500 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20  ->readOnly );.. 
2b510 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
2b520 6c 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  l to create a ta
2b530 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  ble if any curso
2b540 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  rs are open on t
2b550 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
2b560 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
2b570 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  e in auto-vacuum
2b580 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e   mode the backen
2b590 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20  d may.  ** need 
2b5a0 74 6f 20 6d 6f 76 65 20 61 20 64 61 74 61 62 61  to move a databa
2b5b0 73 65 20 70 61 67 65 20 74 6f 20 6d 61 6b 65 20  se page to make 
2b5c0 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
2b5d0 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 2a 2a   root-page..  **
2b5e0 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   If an open curs
2b5f0 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 65  or was using the
2b600 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
2b610 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 20 20 2a  would occur..  *
2b620 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75  /.  if( pBt->pCu
2b630 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
2b640 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2b650 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
2b660 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2b670 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  CUUM.  rc = allo
2b680 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2b690 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2b6a0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2b6b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b6c0 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70  c;.#else.  if( p
2b6d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2b6e0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
2b6f0 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
2b700 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
2b710 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
2b720 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
2b730 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2b740 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
2b750 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
2b760 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
2b770 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
2b780 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61  a[3] from the da
2b790 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d  tabase to determ
2b7a0 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20  ine where the.  
2b7b0 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f    ** root page o
2b7c0 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
2b7d0 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b  should go. meta[
2b7e0 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  3] is the larges
2b7f0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2b800 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61  ** created so fa
2b810 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f  r, so the new ro
2b820 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61  ot-page is (meta
2b830 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20  [3]+1)..    */. 
2b840 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b850 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
2b860 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
2b870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b880 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2b890 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
2b8a0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
2b8b0 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
2b8c0 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
2b8d0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
2b8e0 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
2b8f0 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2b900 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
2b910 20 20 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d     if( pgnoRoot=
2b920 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
2b930 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
2b940 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
2b950 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
2b960 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
2b970 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
2b980 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2b990 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
2b9a0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
2b9b0 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
2b9c0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
2b9d0 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
2b9e0 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
2b9f0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
2ba00 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2ba10 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
2ba20 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
2ba30 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
2ba40 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
2ba50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2ba60 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2ba70 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
2ba80 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
2ba90 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
2baa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2bac0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2bad0 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
2bae0 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
2baf0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2bb00 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
2bb10 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
2bb20 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
2bb30 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
2bb40 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
2bb50 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
2bb60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bb70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bb80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bb90 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2bba0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70  ptrmapGet(pBt, p
2bbb0 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c  gnoRoot, &eType,
2bbc0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
2bbd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bbe0 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50  E_OK || eType==P
2bbf0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c  TRMAP_ROOTPAGE |
2bc00 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
2bc10 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
2bc20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2bc30 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2bc40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2bc50 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2bc60 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
2bc70 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20  OOTPAGE );.     
2bc80 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
2bc90 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2bca0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
2bcb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bcc0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2bcd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2bce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bcf0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2bd00 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2bd10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2bd20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65   }.      rc = re
2bd30 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
2bd40 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50  pRoot, eType, iP
2bd50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65  trPage, pgnoMove
2bd60 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2bd70 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2bd80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bd90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bda0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2bdb0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65   }.      rc = ge
2bdc0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2bdd0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2bde0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2bdf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2be10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2be20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2be30 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
2be40 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2be50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2be60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2be70 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2be80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2be90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2bea0 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
2beb0 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
2bec0 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
2bed0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2bee0 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
2bef0 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
2bf00 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
2bf10 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2bf20 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
2bf30 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
2bf40 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
2bf50 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2bf60 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2bf70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bf80 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2bf90 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2bfa0 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
2bfb0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2bfc0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2bfd0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2bfe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bff0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
2c000 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2c010 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2c020 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2c030 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
2c040 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2c050 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
2c060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2c070 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c080 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
2c090 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
2c0a0 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
2c0b0 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
2c0c0 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
2c0d0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
2c0e0 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
2c0f0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
2c100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c110 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
2c120 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
2c130 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
2c140 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
2c150 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
2c160 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2c170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2c180 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
2c190 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2c1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c1b0 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
2c1c0 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
2c1d0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
2c1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2c1f0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
2c200 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
2c210 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2c220 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
2c230 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
2c240 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
2c250 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
2c260 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
2c270 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
2c280 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2c290 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
2c2a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2c2b0 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
2c2c0 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65   if( pgno>sqlite
2c2d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2c2e0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
2c2f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c300 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c310 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41    }..  rc = getA
2c320 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2c330 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50  pgno, &pPage, pP
2c340 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
2c350 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2c360 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2c370 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
2c380 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
2c390 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2c3a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
2c3b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2c3c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2c3d0 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
2c3e0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
2c3f0 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
2c400 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20  ->pParent, 1);. 
2c410 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2c420 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2c430 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2c440 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2c450 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2c460 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2c470 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2c480 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2c490 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2c4a0 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
2c4b0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2c4c0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
2c4d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
2c4e0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2c4f0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   1);.    if( rc 
2c500 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2c510 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2c520 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65  }.  if( freePage
2c530 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  Flag ){.    rc =
2c540 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2c550 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
2c560 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c570 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2c580 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Page))==0 ){.   
2c590 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2c5a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2c5b0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2c5c0 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65  }..cleardatabase
2c5d0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  page_out:.  rele
2c5e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2c5f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c600 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
2c610 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2c620 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  m a single table
2c630 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c640 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20  .  iTable is.** 
2c650 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2c660 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  of the root of t
2c670 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72  he table.  After
2c680 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2c690 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f  turns,.** the ro
2c6a0 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
2c6b0 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73  , but still exis
2c6c0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ts..**.** This r
2c6d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c  outine will fail
2c6e0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43   with SQLITE_LOC
2c6f0 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65  KED if there are
2c700 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61   any open.** rea
2c710 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  d cursors on the
2c720 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72   table.  Open wr
2c730 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
2c740 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
2c750 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
2c760 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2c770 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
2c780 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2c790 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  Table){.  int rc
2c7a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2c7b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
2c7c0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
2c7d0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2c7e0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2c7f0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2c800 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2c810 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
2c820 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b   = checkReadLock
2c830 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b  s(p, iTable, 0);
2c840 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2c850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c860 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
2c870 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63  osition of all c
2c880 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
2c890 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
2c8a0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
2c8b0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2c8c0 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20  rs(pBt, iTable, 
2c8d0 30 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0)) ){.    retur
2c8e0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  n rc;.  }..  ret
2c8f0 75 72 6e 20 63 6c 65 61 72 44 61 74 61 62 61 73  urn clearDatabas
2c900 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  ePage(pBt, (Pgno
2c910 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a  )iTable, 0, 0);.
2c920 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
2c930 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2c940 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64  n a table and ad
2c950 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  d the root of th
2c960 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68  e table to.** th
2c970 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63  e freelist.  Exc
2c980 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66  ept, the root of
2c990 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74   the principle t
2c9a0 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e  able (the one on
2c9b0 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e  .** page 1) is n
2c9c0 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68  ever added to th
2c9d0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
2c9e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2c9f0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
2ca00 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
2ca10 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
2ca20 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20  n.** cursors on 
2ca30 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2ca40 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69   If AUTOVACUUM i
2ca50 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68  s enabled and th
2ca60 65 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65  e page at iTable
2ca70 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
2ca80 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  .** root page in
2ca90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2caa0 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  le, then the las
2cab0 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20  t root page .** 
2cac0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2cad0 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e  file is moved in
2cae0 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d  to the slot form
2caf0 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2cb00 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74  .** iTable and t
2cb10 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f  hat last slot fo
2cb20 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2cb30 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  by the last root
2cb40 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65   page.** is adde
2cb50 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
2cb60 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61  t instead of iTa
2cb70 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61  ble.  In this sa
2cb80 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70  y, all.** root p
2cb90 61 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74  ages are kept at
2cba0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
2cbb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2cbc0 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  ile, which.** is
2cbd0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41   necessary for A
2cbe0 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72  UTOVACUUM to wor
2cbf0 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76  k right.  *piMov
2cc00 65 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ed is set to the
2cc10 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72   .** page number
2cc20 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65   that used to be
2cc30 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2cc40 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
2cc50 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f  before.** the mo
2cc60 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20  ve.  If no page 
2cc70 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d  gets moved, *piM
2cc80 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30  oved is set to 0
2cc90 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f  ..** The last ro
2cca0 6f 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72  ot page is recor
2ccb0 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61  ded in meta[3] a
2ccc0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  nd the value of.
2ccd0 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70  ** meta[3] is up
2cce0 64 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72  dated by this pr
2ccf0 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ocedure..*/.int 
2cd00 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2cd10 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2cd20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
2cd30 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  *piMoved){.  int
2cd40 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2cd50 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53  pPage = 0;.  BtS
2cd60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2cd70 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  pBt;..  if( p->i
2cd80 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
2cd90 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
2cda0 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
2cdb0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2cdc0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2cdd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69  ;.  }..  /* It i
2cde0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f  s illegal to dro
2cdf0 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79  p a table if any
2ce00 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65   cursors are ope
2ce10 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  n on the.  ** da
2ce20 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
2ce30 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d  because in auto-
2ce40 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20  vacuum mode the 
2ce50 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a  backend may.  **
2ce60 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e   need to move an
2ce70 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20  other root-page 
2ce80 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65  to fill a gap le
2ce90 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2cea0 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65  d.  ** root page
2ceb0 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72  . If an open cur
2cec0 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68  sor was using th
2ced0 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65  is page a proble
2cee0 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63  m would .  ** oc
2cef0 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cur..  */.  if( 
2cf00 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pBt->pCursor ){.
2cf10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cf20 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20  E_LOCKED;.  }.. 
2cf30 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2cf40 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
2cf50 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
2cf60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2cf70 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
2cf80 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
2cf90 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69  (p, iTable);.  i
2cfa0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c  f( rc ){.    rel
2cfb0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2cfc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2cfd0 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20    }..  *piMoved 
2cfe0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62  = 0;..  if( iTab
2cff0 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53  le>1 ){.#ifdef S
2d000 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2d010 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66  ACUUM.    rc = f
2d020 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2d030 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2d040 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  pPage);.#else.  
2d050 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2d060 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50  acuum ){.      P
2d070 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  gno maxRootPgno;
2d080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d090 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2d0a0 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67  p, 4, &maxRootPg
2d0b0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2d0c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d0d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d0e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2d0f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d100 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2d110 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f  ( iTable==maxRoo
2d120 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  tPgno ){.       
2d130 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
2d140 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69   being dropped i
2d150 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  s the table with
2d160 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2d170 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2d180 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2d190 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68  database, put th
2d1a0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74  e root page on t
2d1b0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20  he free list. . 
2d1c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d1d0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2d1e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2d1f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2d200 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2d210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d220 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d230 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d250 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2d260 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
2d270 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68  does not have th
2d280 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
2d290 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2d2a0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
2d2b0 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74  abase. So move t
2d2c0 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  he page that doe
2d2d0 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  s into the .    
2d2e0 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20      ** gap left 
2d2f0 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72  by the deleted r
2d300 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20  oot-page..      
2d310 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d    */.        Mem
2d320 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20  Page *pMove;.   
2d330 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d340 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2d350 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
2d360 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
2d370 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
2d380 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d3a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d3c0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2d3d0 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54  e(pBt, pMove, PT
2d3e0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2d3f0 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , iTable);.     
2d400 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d410 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2d420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2d440 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d450 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2d460 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  getPage(pBt, max
2d470 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2d480 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2d490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2d4b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2d4c0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  }.        rc = f
2d4d0 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  reePage(pMove);.
2d4e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d4f0 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2d500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d540 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f  *piMoved = maxRo
2d550 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  otPgno;.      }.
2d560 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
2d570 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d  e new 'max-root-
2d580 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74  page' value in t
2d590 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
2d5a0 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  er. This.      *
2d5b0 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c  * is the old val
2d5c0 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73  ue less one, les
2d5d0 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68  s one more if th
2d5e0 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20  at happens to.  
2d5f0 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74      ** be a root
2d600 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65  -page number, le
2d610 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20  ss one again if 
2d620 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20  that is the.    
2d630 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2d640 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f  E_PAGE..      */
2d650 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67  .      maxRootPg
2d660 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  no--;.      if( 
2d670 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e  maxRootPgno==PEN
2d680 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2d690 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Bt) ){.        m
2d6a0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2d6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d6c0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52  maxRootPgno==PTR
2d6d0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2d6e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
2d6f0 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
2d700 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
2d710 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
2d720 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
2d730 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2d740 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
2d750 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2d760 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78  teMeta(p, 4, max
2d770 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  RootPgno);.    }
2d780 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2d790 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2d7a0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2d7b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2d7c0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
2d7d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69  {.    /* If sqli
2d7e0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2d7f0 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20  e was called on 
2d800 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a  page 1. */.    z
2d810 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50  eroPage(pPage, P
2d820 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2d830 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  AF );.    releas
2d840 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2d850 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
2d860 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
2d870 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  the meta-informa
2d880 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61  tion out of a da
2d890 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65  tabase file.  Me
2d8a0 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20  ta[0].** is the 
2d8b0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
2d8c0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
2d8d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2d8e0 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f   Meta[1].** thro
2d8f0 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65  ugh meta[15] are
2d900 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
2d910 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79  se by higher lay
2d920 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ers.  Meta[0].**
2d930 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
2d940 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65  he others are re
2d950 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  ad/write..** .**
2d960 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   The schema laye
2d970 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76  r numbers meta v
2d980 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c  alues differentl
2d990 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d  y.  At the schem
2d9a0 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20  a.** layer (and 
2d9b0 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e  the SetCookie an
2d9c0 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63  d ReadCookie opc
2d9d0 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72  odes) the number
2d9e0 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65   of.** free page
2d9f0 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  s is not visible
2da00 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20  .  So Cookie[0] 
2da10 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d  is the same as M
2da20 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73  eta[1]..*/.int s
2da30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2da40 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
2da50 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61   idx, u32 *pMeta
2da60 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
2da70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
2da80 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2da90 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
2daa0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2dab0 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20  .  /* Reading a 
2dac0 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
2dad0 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  requires a read-
2dae0 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28  lock on page 1 (
2daf0 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74  and hence.  ** t
2db00 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2db10 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20   table. We grab 
2db20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64  this lock regard
2db30 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2db40 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  or.  ** not the 
2db50 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2db60 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
2db70 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f  et (the table ro
2db80 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a  oted at page.  *
2db90 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61  * 1 is treated a
2dba0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
2dbb0 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f   by queryTableLo
2dbc0 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62  ck() and lockTab
2dbd0 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  le())..  */.  rc
2dbe0 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
2dbf0 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
2dc00 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
2dc10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2dc20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2dc30 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
2dc40 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2dc50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2dc60 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
2dc70 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
2dc80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2dc90 6e 20 72 63 3b 0a 20 20 70 50 31 20 3d 20 28 75  n rc;.  pP1 = (u
2dca0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
2dcb0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2dcc0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  ta(pDbPage);.  *
2dcd0 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
2dce0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
2dcf0 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  ]);.  sqlite3Pag
2dd00 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
2dd10 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76  ;..  /* If autov
2dd20 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62  acuumed is disab
2dd30 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2dd40 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79  d but we are try
2dd50 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63  ing to .  ** acc
2dd60 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75  ess an autovacuu
2dd70 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  med database, th
2dd80 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61  en make the data
2dd90 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a  base readonly. .
2dda0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2ddb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2ddc0 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20  UM.  if( idx==4 
2ddd0 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42  && *pMeta>0 ) pB
2dde0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
2ddf0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72  .#endif..  /* Gr
2de00 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  ab the read-lock
2de10 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2de20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
2de30 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2de40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2de50 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65  ../*.** Write me
2de60 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62  ta-information b
2de70 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
2de80 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20  abase.  Meta[0] 
2de90 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20  is.** read-only 
2dea0 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  and may not be w
2deb0 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ritten..*/.int s
2dec0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2ded0 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  eMeta(Btree *p, 
2dee0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65  int idx, u32 iMe
2def0 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ta){.  BtShared 
2df00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2df10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2df20 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pP1;.  int rc;. 
2df30 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20   assert( idx>=1 
2df40 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2df50 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2df60 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2df70 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2df80 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2df90 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2dfa0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2dfb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
2dfc0 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20  ge1!=0 );.  pP1 
2dfd0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  = pBt->pPage1->a
2dfe0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
2dff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e000 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
2e010 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2e020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 75   return rc;.  pu
2e030 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
2e040 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
2e050 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e060 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
2e070 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79  turn the flag by
2e080 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  te at the beginn
2e090 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20  ing of the page 
2e0a0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
2e0b0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
2e0c0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
2e0d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2e0e0 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
2e0f0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2e100 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52  : What about CUR
2e110 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2e120 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20  state? Probably 
2e130 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  need to call.  *
2e140 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  * restoreOrClear
2e150 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2e160 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65   here..  */.  Me
2e170 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2e180 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65  Cur->pPage;.  re
2e190 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61  turn pPage ? pPa
2e1a0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2e1b0 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b  >hdrOffset] : 0;
2e1c0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2e1d0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
2e1e0 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c  int a disassembl
2e1f0 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  y of the given p
2e200 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  age on standard 
2e210 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  output.  This ro
2e220 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65 64  utine.** is used
2e230 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61   for debugging a
2e240 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e  nd testing only.
2e250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2e260 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74 53  treePageDump(BtS
2e270 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
2e280 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72 73  pgno, int recurs
2e290 69 76 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ive, MemPage *pP
2e2a0 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  arent){.  int rc
2e2b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2e2c0 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  ge;.  int i, j, 
2e2d0 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a  c;.  int nFree;.
2e2e0 20 20 75 31 36 20 69 64 78 3b 0a 20 20 69 6e 74    u16 idx;.  int
2e2f0 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e 43 65 6c   hdr;.  int nCel
2e300 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b  l;.  int isInit;
2e310 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2e320 20 2a 64 61 74 61 3b 0a 20 20 63 68 61 72 20 72   *data;.  char r
2e330 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73 69  ange[20];.  unsi
2e340 67 6e 65 64 20 63 68 61 72 20 70 61 79 6c 6f 61  gned char payloa
2e350 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20 3d 20 67  d[20];..  rc = g
2e360 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
2e370 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20  o)pgno, &pPage, 
2e380 30 29 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20 70  0);.  isInit = p
2e390 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
2e3a0 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
2e3b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 69 74  t==0 ){.    init
2e3c0 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72  Page(pPage, pPar
2e3d0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ent);.  }.  if( 
2e3e0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2e3f0 20 72 63 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d   rc;.  }.  hdr =
2e400 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2e410 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  t;.  data = pPag
2e420 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 20 3d 20  e->aData;.  c = 
2e430 64 61 74 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61  data[hdr];.  pPa
2e440 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20  ge->intKey = (c 
2e450 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  & (PTF_INTKEY|PT
2e460 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b  F_LEAFDATA))!=0;
2e470 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61  .  pPage->zeroDa
2e480 74 61 20 3d 20 28 63 20 26 20 50 54 46 5f 5a 45  ta = (c & PTF_ZE
2e490 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50  RODATA)!=0;.  pP
2e4a0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
2e4b0 28 63 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54  (c & PTF_LEAFDAT
2e4c0 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  A)!=0;.  pPage->
2e4d0 6c 65 61 66 20 3d 20 28 63 20 26 20 50 54 46 5f  leaf = (c & PTF_
2e4e0 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67  LEAF)!=0;.  pPag
2e4f0 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70  e->hasData = !(p
2e500 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c  Page->zeroData |
2e510 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  | (!pPage->leaf 
2e520 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  && pPage->leafDa
2e530 74 61 29 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  ta));.  nCell = 
2e540 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2e550 64 72 2b 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65  dr+3]);.  sqlite
2e560 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
2e570 47 45 20 25 64 3a 20 20 66 6c 61 67 73 3d 30 78  GE %d:  flags=0x
2e580 25 30 32 78 20 20 66 72 61 67 3d 25 64 20 20 20  %02x  frag=%d   
2e590 70 61 72 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67  parent=%d\n", pg
2e5a0 6e 6f 2c 0a 20 20 20 20 64 61 74 61 5b 68 64 72  no,.    data[hdr
2e5b0 5d 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20  ], data[hdr+7], 
2e5c0 0a 20 20 20 20 28 70 50 61 67 65 2d 3e 69 73 49  .    (pPage->isI
2e5d0 6e 69 74 20 26 26 20 70 50 61 67 65 2d 3e 70 50  nit && pPage->pP
2e5e0 61 72 65 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e  arent) ? pPage->
2e5f0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20  pParent->pgno : 
2e600 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64  0);.  assert( hd
2e610 72 20 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20  r == (pgno==1 ? 
2e620 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 69 64  100 : 0) );.  id
2e630 78 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 70  x = hdr + 12 - p
2e640 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  Page->leaf*4;.  
2e650 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
2e660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c  ; i++){.    Cell
2e670 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50  Info info;.    P
2e680 67 6e 6f 20 63 68 69 6c 64 3b 0a 20 20 20 20 75  gno child;.    u
2e690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2e6a0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
2e6b0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  .    int addr;..
2e6c0 20 20 20 20 61 64 64 72 20 3d 20 67 65 74 32 62      addr = get2b
2e6d0 79 74 65 28 26 64 61 74 61 5b 69 64 78 20 2b 20  yte(&data[idx + 
2e6e0 32 2a 69 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c  2*i]);.    pCell
2e6f0 20 3d 20 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a   = &data[addr];.
2e700 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
2e710 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2e720 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
2e730 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20  info.nSize;.    
2e740 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25  sprintf(range,"%
2e750 64 2e 2e 25 64 22 2c 20 61 64 64 72 2c 20 61 64  d..%d", addr, ad
2e760 64 72 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66  dr+sz-1);.    if
2e770 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2e780 0a 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 30  .      child = 0
2e790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e7a0 20 20 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62     child = get4b
2e7b0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
2e7c0 7d 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  }.    sz = info.
2e7d0 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
2e7e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
2e7f0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
2e800 0a 20 20 20 20 69 66 28 20 73 7a 3e 73 69 7a 65  .    if( sz>size
2e810 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31 20 29 20  of(payload)-1 ) 
2e820 73 7a 20 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c  sz = sizeof(payl
2e830 6f 61 64 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63  oad)-1;.    memc
2e840 70 79 28 70 61 79 6c 6f 61 64 2c 20 26 70 43 65  py(payload, &pCe
2e850 6c 6c 5b 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d  ll[info.nHeader]
2e860 2c 20 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a  , sz);.    for(j
2e870 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a  =0; j<sz; j++){.
2e880 20 20 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61        if( payloa
2e890 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79  d[j]<0x20 || pay
2e8a0 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70  load[j]>0x7f ) p
2e8b0 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b  ayload[j] = '.';
2e8c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f  .    }.    paylo
2e8d0 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20  ad[sz] = 0;.    
2e8e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2e8f0 74 66 28 0a 20 20 20 20 20 20 22 63 65 6c 6c 20  tf(.      "cell 
2e900 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c  %2d: i=%-10s chl
2e910 64 3d 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64  d=%-4d nk=%-4lld
2e920 20 6e 64 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64   nd=%-4d payload
2e930 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c  =%s\n",.      i,
2e940 20 72 61 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69   range, child, i
2e950 6e 66 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e  nfo.nKey, info.n
2e960 44 61 74 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20  Data, payload.  
2e970 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21    );.  }.  if( !
2e980 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e990 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e9a0 72 69 6e 74 66 28 22 72 69 67 68 74 5f 63 68 69  rintf("right_chi
2e9b0 6c 64 3a 20 25 64 5c 6e 22 2c 20 67 65 74 34 62  ld: %d\n", get4b
2e9c0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d  yte(&data[hdr+8]
2e9d0 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20  ));.  }.  nFree 
2e9e0 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  = 0;.  i = 0;.  
2e9f0 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
2ea00 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
2ea10 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20  while( idx>0 && 
2ea20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e  idx<pPage->pBt->
2ea30 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
2ea40 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
2ea50 79 74 65 28 26 64 61 74 61 5b 69 64 78 2b 32 5d  yte(&data[idx+2]
2ea60 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72  );.    sprintf(r
2ea70 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69  ange,"%d..%d", i
2ea80 64 78 2c 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20  dx, idx+sz-1);. 
2ea90 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a     nFree += sz;.
2eaa0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2eab0 50 72 69 6e 74 66 28 22 66 72 65 65 62 6c 6f 63  Printf("freebloc
2eac0 6b 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 73  k %2d: i=%-10s s
2ead0 69 7a 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25  ize=%-4d total=%
2eae0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 20  d\n",.       i, 
2eaf0 72 61 6e 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65  range, sz, nFree
2eb00 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74  );.    idx = get
2eb10 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  2byte(&data[idx]
2eb20 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  );.    i++;.  }.
2eb30 20 20 69 66 28 20 69 64 78 21 3d 30 20 29 7b 0a    if( idx!=0 ){.
2eb40 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2eb50 50 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e  Printf("ERROR: n
2eb60 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  ext freeblock in
2eb70 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
2eb80 3a 20 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20  : %d\n", idx);. 
2eb90 20 7d 0a 20 20 69 66 28 20 72 65 63 75 72 73 69   }.  if( recursi
2eba0 76 65 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ve && !pPage->le
2ebb0 61 66 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  af ){.    for(i=
2ebc0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
2ebd0 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  {.      unsigned
2ebe0 20 63 68 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66   char *pCell = f
2ebf0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2ec00 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
2ec10 67 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34  geDump(pBt, get4
2ec20 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20  byte(pCell), 1, 
2ec30 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 64  pPage);.      id
2ec40 78 20 3d 20 67 65 74 32 62 79 74 65 28 70 43 65  x = get2byte(pCe
2ec50 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ll);.    }.    b
2ec60 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 42 74  treePageDump(pBt
2ec70 2c 20 67 65 74 34 62 79 74 65 28 26 64 61 74 61  , get4byte(&data
2ec80 5b 68 64 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61  [hdr+8]), 1, pPa
2ec90 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ge);.  }.  pPage
2eca0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
2ecb0 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
2ecc0 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
2ecd0 62 50 61 67 65 29 3b 0a 20 20 66 66 6c 75 73 68  bPage);.  fflush
2ece0 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65 74 75  (stdout);.  retu
2ecf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ed00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2ed10 50 61 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a  PageDump(Btree *
2ed20 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74  p, int pgno, int
2ed30 20 72 65 63 75 72 73 69 76 65 29 7b 0a 20 20 72   recursive){.  r
2ed40 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 44  eturn btreePageD
2ed50 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f  ump(p->pBt, pgno
2ed60 2c 20 72 65 63 75 72 73 69 76 65 2c 20 30 29 3b  , recursive, 0);
2ed70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
2ed80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2ed90 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
2eda0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
2edb0 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b  ** Fill aResult[
2edc0 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  ] with informati
2edd0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74  on about the ent
2ede0 72 79 20 61 6e 64 20 70 61 67 65 20 74 68 61 74  ry and page that
2edf0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
2ee00 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
2ee10 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  * .**   aResult[
2ee20 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e  0] =  The page n
2ee30 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
2ee40 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74  lt[1] =  The ent
2ee50 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ry number.**   a
2ee60 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74  Result[2] =  Tot
2ee70 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
2ee80 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ries on this pag
2ee90 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33  e.**   aResult[3
2eea0 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28  ] =  Cell size (
2eeb0 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20  local payload + 
2eec0 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65  header).**   aRe
2eed0 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65  sult[4] =  Numbe
2eee0 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
2eef0 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2ef00 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20    aResult[5] =  
2ef10 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
2ef20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67  locks on the pag
2ef30 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36  e.**   aResult[6
2ef40 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f  ] =  Total paylo
2ef50 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b  ad size (local +
2ef60 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20   overflow).**   
2ef70 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65  aResult[7] =  He
2ef80 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ader size in byt
2ef90 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  es.**   aResult[
2efa0 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c  8] =  Local payl
2efb0 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52  oad size.**   aR
2efc0 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65  esult[9] =  Pare
2efd0 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a  nt page number.*
2efe0 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d 3d  *   aResult[10]=
2eff0 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66    Page number of
2f000 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2f010 6c 6f 77 20 70 61 67 65 0a 2a 2a 0a 2a 2a 20 54  low page.**.** T
2f020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
2f030 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
2f040 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
2f050 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
2f060 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 6e 66  e3BtreeCursorInf
2f070 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
2f080 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c 74 2c 20  , int *aResult, 
2f090 69 6e 74 20 75 70 43 6e 74 29 7b 0a 20 20 69 6e  int upCnt){.  in
2f0a0 74 20 63 6e 74 2c 20 69 64 78 3b 0a 20 20 4d 65  t cnt, idx;.  Me
2f0b0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2f0c0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 42 74  Cur->pPage;.  Bt
2f0d0 43 75 72 73 6f 72 20 74 6d 70 43 75 72 3b 0a 0a  Cursor tmpCur;..
2f0e0 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f    int rc = resto
2f0f0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2f100 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29  osition(pCur, 1)
2f110 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2f120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2f130 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
2f140 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2f150 49 6e 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d  Init );.  getTem
2f160 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74  pCursor(pCur, &t
2f170 6d 70 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28  mpCur);.  while(
2f180 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20   upCnt-- ){.    
2f190 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d  moveToParent(&tm
2f1a0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61  pCur);.  }.  pPa
2f1b0 67 65 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67  ge = tmpCur.pPag
2f1c0 65 3b 0a 20 20 61 52 65 73 75 6c 74 5b 30 5d 20  e;.  aResult[0] 
2f1d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
2f1e0 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
2f1f0 70 44 62 50 61 67 65 29 3b 0a 20 20 61 73 73 65  pDbPage);.  asse
2f200 72 74 28 20 61 52 65 73 75 6c 74 5b 30 5d 3d 3d  rt( aResult[0]==
2f210 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
2f220 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 74 6d   aResult[1] = tm
2f230 70 43 75 72 2e 69 64 78 3b 0a 20 20 61 52 65 73  pCur.idx;.  aRes
2f240 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[2] = pPage->
2f250 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 74 6d 70  nCell;.  if( tmp
2f260 43 75 72 2e 69 64 78 3e 3d 30 20 26 26 20 74 6d  Cur.idx>=0 && tm
2f270 70 43 75 72 2e 69 64 78 3c 70 50 61 67 65 2d 3e  pCur.idx<pPage->
2f280 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 67 65 74  nCell ){.    get
2f290 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70 43 75 72  CellInfo(&tmpCur
2f2a0 29 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33  );.    aResult[3
2f2b0 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ] = tmpCur.info.
2f2c0 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52 65 73 75  nSize;.    aResu
2f2d0 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[6] = tmpCur.i
2f2e0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 61  nfo.nData;.    a
2f2f0 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74 6d 70 43  Result[7] = tmpC
2f300 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  ur.info.nHeader;
2f310 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20  .    aResult[8] 
2f320 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 4c  = tmpCur.info.nL
2f330 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
2f340 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20     aResult[3] = 
2f350 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36  0;.    aResult[6
2f360 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75  ] = 0;.    aResu
2f370 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[7] = 0;.    a
2f380 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30 3b 0a 20  Result[8] = 0;. 
2f390 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 34 5d 20   }.  aResult[4] 
2f3a0 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b 0a  = pPage->nFree;.
2f3b0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 64 78    cnt = 0;.  idx
2f3c0 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 61   = get2byte(&pPa
2f3d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2f3e0 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d 29 3b 0a  >hdrOffset+1]);.
2f3f0 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26    while( idx>0 &
2f400 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74  & idx<pPage->pBt
2f410 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
2f420 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69      cnt++;.    i
2f430 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  dx = get2byte(&p
2f440 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 64 78 5d  Page->aData[idx]
2f450 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74  );.  }.  aResult
2f460 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20 69 66 28  [5] = cnt;.  if(
2f470 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
2f480 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50 61 67 65  =0 || isRootPage
2f490 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 61  (pPage) ){.    a
2f4a0 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30 3b 0a 20  Result[9] = 0;. 
2f4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73   }else{.    aRes
2f4c0 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67 65 2d 3e  ult[9] = pPage->
2f4d0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b 0a 20  pParent->pgno;. 
2f4e0 20 7d 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e   }.  if( tmpCur.
2f4f0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
2f500 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30  {.    aResult[10
2f510 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 74 6d  ] = get4byte(&tm
2f520 70 43 75 72 2e 69 6e 66 6f 2e 70 43 65 6c 6c 5b  pCur.info.pCell[
2f530 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76 65  tmpCur.info.iOve
2f540 72 66 6c 6f 77 5d 29 3b 0a 20 20 7d 65 6c 73 65  rflow]);.  }else
2f550 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30  {.    aResult[10
2f560 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  ] = 0;.  }.  rel
2f570 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
2f580 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  tmpCur);.  retur
2f590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2f5a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
2f5b0 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61 73  urn the pager as
2f5c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
2f5d0 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75  BTree.  This rou
2f5e0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2f5f0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
2f600 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
2f610 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65  */.Pager *sqlite
2f620 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72 65  3BtreePager(Btre
2f630 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
2f640 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a  p->pBt->pPager;.
2f650 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  }../*.** This st
2f660 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73 65  ructure is passe
2f670 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67 68  d around through
2f680 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79 20   all the sanity 
2f690 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65  checking routine
2f6a0 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  s.** in order to
2f6b0 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 73   keep track of s
2f6c0 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65  ome global state
2f6d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2f6e0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2f6f0 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74 65  IntegrityCk Inte
2f700 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74 20  grityCk;.struct 
2f710 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20 20  IntegrityCk {.  
2f720 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
2f730 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20 62 65    /* The tree be
2f740 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75 74 20  ing checked out 
2f750 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
2f760 65 72 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 73  er;    /* The as
2f770 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 20  sociated pager. 
2f780 20 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65   Also accessible
2f790 20 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20   by pBt->pPager 
2f7a0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2f7b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f7c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2f7d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
2f7e0 6e 74 20 2a 61 6e 52 65 66 3b 20 20 20 20 20 20  nt *anRef;      
2f7f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
2f800 6d 65 73 20 65 61 63 68 20 70 61 67 65 20 69 73  mes each page is
2f810 20 72 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20   referenced */. 
2f820 20 69 6e 74 20 6d 78 45 72 72 3b 20 20 20 20 20   int mxErr;     
2f830 20 20 20 2f 2a 20 53 74 6f 70 20 61 63 63 75 6d     /* Stop accum
2f840 75 6c 61 74 69 6e 67 20 65 72 72 6f 72 73 20 77  ulating errors w
2f850 68 65 6e 20 74 68 69 73 20 72 65 61 63 68 65 73  hen this reaches
2f860 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 68 61 72 20   zero */.  char 
2f870 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f 2a 20  *zErrMsg;    /* 
2f880 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
2f890 2e 20 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 65 72  .  NULL if no er
2f8a0 72 6f 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 20 20  rors seen. */.  
2f8b0 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
2f8c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
2f8d0 65 73 73 61 67 65 73 20 77 72 69 74 74 65 6e 20  essages written 
2f8e0 74 6f 20 7a 45 72 72 4d 73 67 20 73 6f 20 66 61  to zErrMsg so fa
2f8f0 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  r */.};..#ifndef
2f900 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2f910 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
2f920 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
2f930 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
2f940 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
2f950 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f960 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
2f970 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
2f980 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
2f990 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
2f9a0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
2f9b0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2f9c0 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
2f9d0 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  2;.  if( !pCheck
2f9e0 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
2f9f0 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
2fa00 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
2fa10 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
2fa20 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2fa30 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65    zMsg2 = sqlite
2fa40 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
2fa50 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2fa60 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67  (ap);.  if( zMsg
2fa70 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22  1==0 ) zMsg1 = "
2fa80 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d  ";.  if( pCheck-
2fa90 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
2faa0 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68  char *zOld = pCh
2fab0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20  eck->zErrMsg;.  
2fac0 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73    pCheck->zErrMs
2fad0 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  g = 0;.    sqlit
2fae0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68  e3SetString(&pCh
2faf0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f  eck->zErrMsg, zO
2fb00 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c  ld, "\n", zMsg1,
2fb10 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
2fb20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2fb30 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65  e(zOld);.  }else
2fb40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
2fb50 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
2fb60 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  zErrMsg, zMsg1, 
2fb70 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
2fb80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
2fb90 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e  ee(zMsg2);.}.#en
2fba0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2fbb0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2fbc0 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
2fbd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2fbe0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
2fbf0 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
2fc00 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
2fc10 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
2fc20 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
2fc30 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
2fc40 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
2fc50 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
2fc60 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
2fc70 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
2fc80 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
2fc90 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
2fca0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2fcb0 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
2fcc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2fcd0 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
2fce0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2fcf0 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
2fd00 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2fd10 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
2fd20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2fd30 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
2fd40 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69  k *pCheck, int i
2fd50 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
2fd60 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
2fd70 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
2fd80 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
2fd90 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69  heck->nPage || i
2fda0 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68  Page<0 ){.    ch
2fdb0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2fdc0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
2fdd0 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  invalid page num
2fde0 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b  ber %d", iPage);
2fdf0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2fe00 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d   }.  if( pCheck-
2fe10 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31  >anRef[iPage]==1
2fe20 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
2fe30 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
2fe40 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65  Context, "2nd re
2fe50 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2fe60 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
2fe70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2fe80 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b   return  (pCheck
2fe90 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b  ->anRef[iPage]++
2fea0 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  )>1;.}..#ifndef 
2feb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2fec0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65  VACUUM./*.** Che
2fed0 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ck that the entr
2fee0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
2fef0 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43  -map for page iC
2ff00 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a  hild maps to .**
2ff10 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70   page iParent, p
2ff20 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54  ointer type ptrT
2ff30 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70  ype. If not, app
2ff40 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  end an error mes
2ff50 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63  sage.** to pChec
2ff60 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
2ff70 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20  d checkPtrmap(. 
2ff80 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
2ff90 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67  heck,   /* Integ
2ffa0 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65  rity check conte
2ffb0 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  xt */.  Pgno iCh
2ffc0 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ild,           /
2ffd0 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  * Child page num
2ffe0 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ber */.  u8 eTyp
2fff0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
30000 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
30010 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a  ter map type */.
30020 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20    Pgno iParent, 
30030 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
30040 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
30050 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
30060 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
30070 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
30080 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72  /* Context descr
30090 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72  iption (used for
300a0 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29   error msg) */.)
300b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38  {.  int rc;.  u8
300c0 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20   ePtrmapType;.  
300d0 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65  Pgno iPtrmapPare
300e0 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d  nt;..  rc = ptrm
300f0 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42  apGet(pCheck->pB
30100 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72  t, iChild, &ePtr
30110 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61  mapType, &iPtrma
30120 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
30130 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30140 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
30150 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30160 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f  text, "Failed to
30170 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79   read ptrmap key
30180 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20  =%d", iChild);. 
30190 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
301a0 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70    if( ePtrmapTyp
301b0 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72  e!=eType || iPtr
301c0 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65  mapParent!=iPare
301d0 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  nt ){.    checkA
301e0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
301f0 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
30200 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65    "Bad ptr map e
30210 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65  ntry key=%d expe
30220 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74  cted=(%d,%d) got
30230 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20  =(%d,%d)", .    
30240 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c    iChild, eType,
30250 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61   iParent, ePtrma
30260 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61  pType, iPtrmapPa
30270 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  rent);.  }.}.#en
30280 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
30290 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
302a0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f  f the freelist o
302b0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
302c0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56   page list..** V
302d0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
302e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
302f0 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e  n the list is N.
30300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30310 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74  checkList(.  Int
30320 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30330 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20  ,  /* Integrity 
30340 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74  checking context
30350 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65   */.  int isFree
30360 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  List,       /* T
30370 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69  rue for a freeli
30380 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f  st.  False for o
30390 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
303a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  t */.  int iPage
303b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
303c0 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
303d0 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68  first page in th
303e0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
303f0 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
30400 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
30410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
30420 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63   the list */.  c
30430 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
30440 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
30450 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
30460 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
30470 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64  ;.  int expected
30480 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72   = N;.  int iFir
30490 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68  st = iPage;.  wh
304a0 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20  ile( N-- > 0 && 
304b0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b  pCheck->mxErr ){
304c0 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76  .    DbPage *pOv
304d0 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69  flPage;.    unsi
304e0 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c  gned char *pOvfl
304f0 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50  Data;.    if( iP
30500 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
30510 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
30520 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
30530 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
30540 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
30550 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
30560 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
30570 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
30580 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
30590 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
305a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
305b0 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
305c0 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
305d0 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
305e0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
305f0 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  rGet(pCheck->pPa
30600 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
30610 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b  , &pOvflPage) ){
30620 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
30630 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
30640 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20  ontext, "failed 
30650 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c  to get page %d",
30660 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62   iPage);.      b
30670 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
30680 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73  pOvflData = (uns
30690 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
306a0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
306b0 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20  (pOvflPage);.   
306c0 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20   if( isFreeList 
306d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
306e0 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
306f0 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Data[4]);.#ifnde
30700 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30710 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
30720 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
30730 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
30740 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
30750 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
30760 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30770 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30780 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
30790 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
307a0 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
307b0 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20  ze/4-8 ){.      
307c0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
307d0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
307e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
307f0 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
30800 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
30810 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
30820 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
30830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
30850 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30860 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
30870 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
30880 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Data[8+i*4]);.#i
30890 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
308a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
308b0 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
308c0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
308d0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
308e0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
308f0 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
30900 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
30910 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
30920 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
30930 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
30940 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
30950 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
30960 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
30970 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
30980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
30990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
309a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
309b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
309c0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
309d0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
309e0 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
309f0 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
30a00 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
30a10 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
30a20 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
30a30 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
30a40 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
30a50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
30a60 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
30a70 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
30a80 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
30a90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
30aa0 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
30ab0 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
30ac0 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  flData);.       
30ad0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
30ae0 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f  eck, i, PTRMAP_O
30af0 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c  VERFLOW2, iPage,
30b00 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
30b10 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
30b20 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74  .    iPage = get
30b30 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
30b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
30b50 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67  erUnref(pOvflPag
30b60 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
30b70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30b80 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
30b90 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
30ba0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
30bb0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f  Y_CHECK./*.** Do
30bc0 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20   various sanity 
30bd0 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67  checks on a sing
30be0 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65  le page of a tre
30bf0 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
30c00 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52  e tree depth.  R
30c10 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e  oot pages return
30c20 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20   0.  Parents of 
30c30 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65  root pages.** re
30c40 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66  turn 1, and so f
30c50 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  orth..** .** The
30c60 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f  se checks are do
30c70 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ne:.**.**      1
30c80 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
30c90 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65  t cells and free
30ca0 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76  blocks do not ov
30cb0 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20  erlap.**        
30cc0 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f    but combine to
30cd0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65   completely cove
30ce0 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20  r the page..**  
30cf0 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72  NO  2.  Make sur
30d00 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20  e cell keys are 
30d10 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f  in order..**  NO
30d20 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    3.  Make sure 
30d30 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  no key is less t
30d40 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
30d50 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zLowerBound..** 
30d60 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75   NO  4.  Make su
30d70 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65  re no key is gre
30d80 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
30d90 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e  al to zUpperBoun
30da0 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43  d..**      5.  C
30db0 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
30dc0 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  ty of overflow p
30dd0 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e  ages..**      6.
30de0 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61    Recursively ca
30df0 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  ll checkTreePage
30e00 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   on all children
30e10 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65  ..**      7.  Ve
30e20 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
30e30 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  pth of all child
30e40 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e  ren is the same.
30e50 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b  .**      8.  Mak
30e60 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65  e sure this page
30e70 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25   is at least 33%
30e80 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74   full or else it
30e90 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
30ea0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
30eb0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
30ec0 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67  int checkTreePag
30ed0 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  e(.  IntegrityCk
30ee0 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f   *pCheck,  /* Co
30ef0 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61  ntext for the sa
30f00 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20  nity check */.  
30f10 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
30f20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
30f30 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
30f40 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d   to check */.  M
30f50 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
30f60 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
30f70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  age */.  char *z
30f80 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
30f90 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
30fa0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
30fb0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
30fc0 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
30fd0 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
30fe0 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
30ff0 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
31000 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
31010 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
31020 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
31030 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
31040 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
31050 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e  ..  sprintf(zCon
31060 74 65 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20  text, "Page %d: 
31070 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ", iPage);..  /*
31080 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
31090 70 61 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f  page exists.  */
310a0 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d  .  pBt = pCheck-
310b0 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69  >pBt;.  usableSi
310c0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
310d0 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67  Size;.  if( iPag
310e0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
310f0 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28  .  if( checkRef(
31100 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a  pCheck, iPage, z
31110 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29  ParentContext) )
31120 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
31130 20 28 72 63 20 3d 20 67 65 74 50 61 67 65 28 70   (rc = getPage(p
31140 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
31150 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
31160 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
31170 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
31180 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22  ontext,.       "
31190 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68  unable to get th
311a0 65 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f  e page. error co
311b0 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de=%d", rc);.   
311c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
311d0 20 69 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50   if( (rc = initP
311e0 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
311f0 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt))!=0 ){.    c
31200 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31210 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31220 22 69 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  "initPage() retu
31230 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
31240 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
31250 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31260 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31270 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
31280 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
31290 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
312a0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
312b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
312c0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
312d0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
312e0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
312f0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
31300 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
31310 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
31320 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
31330 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e      sprintf(zCon
31340 74 65 78 74 2c 20 22 4f 6e 20 74 72 65 65 20 70  text, "On tree p
31350 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20  age %d cell %d: 
31360 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20  ", iPage, i);.  
31370 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
31380 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20  ll(pPage,i);.   
31390 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
313a0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
313b0 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66  o);.    sz = inf
313c0 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28  o.nData;.    if(
313d0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
313e0 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65  ) sz += info.nKe
313f0 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  y;.    assert( s
31400 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  z==info.nPayload
31410 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69   );.    if( sz>i
31420 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
31430 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
31440 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  (sz - info.nLoca
31450 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  l + usableSize -
31460 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20   5)/(usableSize 
31470 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f  - 4);.      Pgno
31480 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
31490 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
314a0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69  .iOverflow]);.#i
314b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
314c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
314d0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
314e0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
314f0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31500 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  heck, pgnoOvfl, 
31510 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
31520 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31530 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
31540 69 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69  if.      checkLi
31550 73 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67  st(pCheck, 0, pg
31560 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a  noOvfl, nPage, z
31570 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  Context);.    }.
31580 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61  .    /* Check sa
31590 6e 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69  nity of left chi
315a0 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ld page..    */.
315b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
315c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67  leaf ){.      pg
315d0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
315e0 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
315f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31600 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
31610 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
31620 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
31630 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
31640 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
31650 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
31660 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
31670 69 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68  if.      d2 = ch
31680 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
31690 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43  ck,pgno,pPage,zC
316a0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69  ontext);.      i
316b0 66 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65  f( i>0 && d2!=de
316c0 70 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63  pth ){.        c
316d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
316e0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
316f0 22 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74  "Child page dept
31700 68 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20  h differs");.   
31710 20 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68     }.      depth
31720 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = d2;.    }.  }
31730 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
31740 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
31750 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
31760 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
31770 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
31780 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74     sprintf(zCont
31790 65 78 74 2c 20 22 4f 6e 20 70 61 67 65 20 25 64  ext, "On page %d
317a0 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
317b0 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
317c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
317d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
317e0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
317f0 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
31800 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
31810 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
31820 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
31830 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31840 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
31850 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
31860 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31870 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
31880 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
31890 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
318a0 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
318b0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
318c0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
318d0 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
318e0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61  qliteMalloc( usa
318f0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
31900 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73   hit ){.    mems
31910 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
31920 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
31930 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
31940 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
31950 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
31960 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
31970 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
31980 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
31990 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
319a0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
319b0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
319c0 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
319d0 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65     int size = ce
319e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
319f0 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
31a00 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
31a10 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
31a20 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
31a30 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
31a40 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31a50 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
31a60 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
31a70 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
31a80 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
31a90 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
31aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31ab0 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
31ac0 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
31ad0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
31ae0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
31af0 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
31b00 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
31b10 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
31b20 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
31b30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
31b40 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
31b50 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
31b60 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
31b70 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
31b80 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
31b90 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
31ba0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
31bb0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31bc0 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
31bd0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
31be0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
31bf0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
31c00 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
31c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31c20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
31c30 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
31c40 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
31c50 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
31c60 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
31c70 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
31c80 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
31c90 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
31ca0 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
31cb0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
31cc0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
31cd0 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
31ce0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31cf0 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
31d00 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
31d10 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
31d20 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
31d30 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
31d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31d50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
31d60 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
31d70 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
31d80 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31d90 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
31da0 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
31db0 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
31dc0 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
31dd0 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
31de0 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
31df0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
31e00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
31e10 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61  e(hit);..  relea
31e20 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
31e30 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b   return depth+1;
31e40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
31e50 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
31e60 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
31e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31e80 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
31e90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
31ea0 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c  ine does a compl
31eb0 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ete check of the
31ec0 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c   given BTree fil
31ed0 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a  e.  aRoot[] is.*
31ee0 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61  * an array of pa
31ef0 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65  ges numbers were
31f00 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65   each page numbe
31f10 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  r is the root pa
31f20 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65  ge of.** a table
31f30 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20  .  nRoot is the 
31f40 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
31f50 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a  s in aRoot..**.*
31f60 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
31f70 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73  checks out, this
31f80 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
31f90 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74   NULL.  If somet
31fa0 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73  hing is.** amiss
31fb0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
31fc0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
31fd0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
31fe0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
31ff0 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  .** and a pointe
32000 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20  r to that error 
32010 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72  message is retur
32020 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ned.  The callin
32030 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
32040 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
32050 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72   freeing the err
32060 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
32070 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63  it is done..*/.c
32080 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
32090 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  eIntegrityCheck(
320a0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
320b0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
320c0 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   be checked */. 
320d0 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f   int *aRoot,   /
320e0 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f  * An array of ro
320f0 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  ot pages numbers
32100 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20   for individual 
32110 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  trees */.  int n
32120 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62  Root,    /* Numb
32130 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
32140 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e   aRoot[] */.  in
32150 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53  t mxErr,    /* S
32160 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72  top reporting er
32170 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20  rors after this 
32180 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  many */.  int *p
32190 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65  nErr    /* Write
321a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
321b0 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76  s seen to this v
321c0 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ariable */.){.  
321d0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  int i;.  int nRe
321e0 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
321f0 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61   sCheck;.  BtSha
32200 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
32210 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  t;..  nRef = sql
32220 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
32230 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
32240 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
32250 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
32260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
32270 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75  turn sqliteStrDu
32280 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
32290 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
322a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
322b0 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
322c0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
322d0 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
322e0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
322f0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
32300 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
32310 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
32320 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
32330 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
32340 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
32350 70 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28  pnErr = 0;.  if(
32360 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30   sCheck.nPage==0
32370 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
32380 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
32390 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
323a0 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52    }.  sCheck.anR
323b0 65 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ef = sqliteMallo
323c0 63 52 61 77 28 20 28 73 43 68 65 63 6b 2e 6e 50  cRaw( (sCheck.nP
323d0 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43  age+1)*sizeof(sC
323e0 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29  heck.anRef[0]) )
323f0 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e  ;.  if( !sCheck.
32400 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c  anRef ){.    unl
32410 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
32420 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72  (pBt);.    *pnEr
32430 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  r = 1;.    retur
32440 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  n sqlite3MPrintf
32450 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c  ("Unable to mall
32460 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20  oc %d bytes", . 
32470 20 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e         (sCheck.n
32480 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73  Page+1)*sizeof(s
32490 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29  Check.anRef[0]))
324a0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
324b0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
324c0 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61  ; i++){ sCheck.a
324d0 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20  nRef[i] = 0; }. 
324e0 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54   i = PENDING_BYT
324f0 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69  E_PAGE(pBt);.  i
32500 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  f( i<=sCheck.nPa
32510 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b  ge ){.    sCheck
32520 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20  .anRef[i] = 1;. 
32530 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72   }.  sCheck.zErr
32540 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  Msg = 0;..  /* C
32550 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
32560 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
32570 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
32580 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
32590 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
325a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
325b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
325c0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
325d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
325e0 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
325f0 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
32600 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
32610 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
32620 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68  ; i<nRoot && sCh
32630 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
32640 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69  .    if( aRoot[i
32650 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
32660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32670 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32680 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
32690 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74  oVacuum && aRoot
326a0 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63  [i]>1 ){.      c
326b0 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65  heckPtrmap(&sChe
326c0 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54  ck, aRoot[i], PT
326d0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
326e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
326f0 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
32700 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52  Page(&sCheck, aR
32710 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74  oot[i], 0, "List
32720 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20   of tree roots: 
32730 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ");.  }..  /* Ma
32740 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61  ke sure every pa
32750 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  ge in the file i
32760 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a  s referenced.  *
32770 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  /.  for(i=1; i<=
32780 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20  sCheck.nPage && 
32790 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
327a0 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
327b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
327c0 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  M.    if( sCheck
327d0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a  .anRef[i]==0 ){.
327e0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
327f0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
32800 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
32810 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
32820 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
32830 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32840 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
32850 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65  acuum, make sure
32860 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61   no tables conta
32870 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  in.    ** refere
32880 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d  nces to pointer-
32890 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a  map pages..    *
328a0 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  /.    if( sCheck
328b0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20  .anRef[i]==0 && 
328c0 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
328d0 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d  PAGENO(pBt, i)!=
328e0 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56  i || !pBt->autoV
328f0 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
32900 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
32910 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
32920 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
32930 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  d", i);.    }.  
32940 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
32950 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20  ef[i]!=0 && .   
32960 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
32970 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26  NO(pBt, i)==i &&
32980 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32990 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
329a0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
329b0 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d  k, 0, "Pointer m
329c0 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65  ap page %d is re
329d0 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20  ferenced", i);. 
329e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
329f0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
32a00 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69  this analysis di
32a10 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20  d not leave any 
32a20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20  unref() pages.  
32a30 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  */.  unlockBtree
32a40 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
32a50 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c   if( nRef != sql
32a60 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
32a70 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
32a80 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
32a90 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
32aa0 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e   .      "Outstan
32ab0 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20  ding page count 
32ac0 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  goes from %d to 
32ad0 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61  %d during this a
32ae0 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20  nalysis",.      
32af0 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67  nRef, sqlite3Pag
32b00 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
32b10 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
32b20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
32b30 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
32b40 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
32b50 69 74 65 46 72 65 65 28 73 43 68 65 63 6b 2e 61  iteFree(sCheck.a
32b60 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20  nRef);.  *pnErr 
32b70 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20  = sCheck.nErr;. 
32b80 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a   return sCheck.z
32b90 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66  ErrMsg;.}.#endif
32ba0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
32bb0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
32bc0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
32bd0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
32be0 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  me of the underl
32bf0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
32c00 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
32c10 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
32c20 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65  etFilename(Btree
32c30 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
32c40 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
32c50 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
32c60 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
32c70 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
32c80 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
32c90 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
32ca0 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
32cb0 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
32cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32cd0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
32ce0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
32cf0 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a  tDirname(Btree *
32d00 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
32d10 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
32d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
32d30 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
32d40 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
32d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
32d60 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
32d70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32d80 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  e for this datab
32d90 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a  ase. The return.
32da0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
32db0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
32dc0 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20  same regardless 
32dd0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a  of whether the j
32de0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
32df0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
32e00 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  or not..*/.const
32e10 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
32e20 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
32e30 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
32e40 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
32e50 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
32e60 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
32e70 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e  rJournalname(p->
32e80 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
32e90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32ea0 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
32eb0 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c  * Copy the compl
32ec0 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  ete content of p
32ed0 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54  BtFrom into pBtT
32ee0 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  o.  A transactio
32ef0 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74  n.** must be act
32f00 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c  ive for both fil
32f10 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  es..**.** The si
32f20 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74 46 72  ze of file pBtFr
32f30 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75 63 65  om may be reduce
32f40 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
32f50 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ion..** If anyth
32f60 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
32f70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
32f80 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20 72 6f  on pBtFrom is ro
32f90 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e  lled back..*/.in
32fa0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
32fb0 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54  pyFile(Btree *pT
32fc0 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29  o, Btree *pFrom)
32fd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
32fe0 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69  ITE_OK;.  Pgno i
32ff0 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65  , nPage, nToPage
33000 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68  , iSkip;..  BtSh
33010 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
33020 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
33030 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
33040 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28  rom->pBt;..  if(
33050 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pTo->inTrans!=T
33060 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46  RANS_WRITE || pF
33070 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  rom->inTrans!=TR
33080 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
33090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
330a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
330b0 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29  pBtTo->pCursor )
330c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
330d0 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d  USY;.  nToPage =
330e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
330f0 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50  ecount(pBtTo->pP
33100 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65 20 3d  ager);.  nPage =
33110 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
33120 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e  ecount(pBtFrom->
33130 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70  pPager);.  iSkip
33140 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
33150 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20 20 66  PAGE(pBtTo);.  f
33160 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
33170 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67  TE_OK && i<=nPag
33180 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50  e; i++){.    DbP
33190 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
331a0 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29    if( i==iSkip )
331b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72   continue;.    r
331c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
331d0 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61  Get(pBtFrom->pPa
331e0 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65  ger, i, &pDbPage
331f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33200 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
33210 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72  sqlite3PagerOver
33220 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  write(pBtTo->pPa
33230 67 65 72 2c 20 69 2c 20 73 71 6c 69 74 65 33 50  ger, i, sqlite3P
33240 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
33250 61 67 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  age));.    sqlit
33260 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
33270 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Page);.  }.  for
33280 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d  (i=nPage+1; rc==
33290 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
332a0 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  nToPage; i++){. 
332b0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
332c0 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  ge;.    if( i==i
332d0 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Skip ) continue;
332e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
332f0 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d  3PagerGet(pBtTo-
33300 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62  >pPager, i, &pDb
33310 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33320 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  c ) break;.    r
33330 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33340 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
33350 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33360 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33370 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33380 44 6f 6e 74 57 72 69 74 65 28 70 42 74 54 6f 2d  DontWrite(pBtTo-
33390 3e 70 50 61 67 65 72 2c 20 69 29 3b 0a 20 20 7d  >pPager, i);.  }
333a0 0a 20 20 69 66 28 20 21 72 63 20 26 26 20 6e 50  .  if( !rc && nP
333b0 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20  age<nToPage ){. 
333c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
333d0 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 42 74  agerTruncate(pBt
333e0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61 67  To->pPager, nPag
333f0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
33400 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
33410 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f  treeRollback(pTo
33420 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
33430 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rc;  .}.#endif /
33440 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  * SQLITE_OMIT_VA
33450 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  CUUM */../*.** R
33460 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
33470 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
33480 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
33490 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
334a0 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  InTrans(Btree *p
334b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  ){.  return (p &
334c0 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
334d0 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
334e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
334f0 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
33500 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
33510 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
33520 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
33530 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
33540 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  p){.  return (p-
33550 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
33560 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
33570 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
33580 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
33590 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
335a0 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
335b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
335c0 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
335d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
335e0 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
335f0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
33600 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
33610 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
33620 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
33630 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
33640 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
33650 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
33660 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
33670 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
33680 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
33690 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
336a0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
336b0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
336c0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
336d0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
336e0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
336f0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
33700 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
33710 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
33720 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
33730 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
33740 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
33750 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
33760 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
33770 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
33780 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
33790 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
337a0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
337b0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
337c0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
337d0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
337e0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
337f0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
33800 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
33810 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
33820 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
33830 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
33840 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
33850 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
33860 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
33870 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
33880 74 65 33 42 74 72 65 65 53 79 6e 63 28 42 74 72  te3BtreeSync(Btr
33890 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
338a0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
338b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
338c0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
338d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
338e0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
338f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
33900 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
33910 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
33920 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33930 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
33940 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
33950 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
33960 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20  cuumCommit(pBt, 
33970 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20  &nTrunc); .     
33980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
339a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
339b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
339c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
339d0 67 65 72 53 79 6e 63 28 70 42 74 2d 3e 70 50 61  gerSync(pBt->pPa
339e0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
339f0 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runc);.  }.  ret
33a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33a10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
33a20 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
33a30 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65   to a blob of me
33a40 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
33a50 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  with.** a single
33a60 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54   shared-btree. T
33a70 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  he memory is use
33a80 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65  d by client code
33a90 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a 2a   for it's own.**
33aa0 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65   purposes (for e
33ab0 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65  xample, to store
33ac0 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63   a high-level sc
33ad0 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20  hema associated 
33ae0 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61  with .** the sha
33af0 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20  red-btree). The 
33b00 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61  btree layer mana
33b10 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ges reference co
33b20 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a  unting issues..*
33b30 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
33b40 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ime this is call
33b50 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62  ed on a shared-b
33b60 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74  tree, nBytes byt
33b70 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
33b80 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a  are allocated, z
33b90 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72  eroed, and retur
33ba0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
33bb0 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73  r. For each subs
33bc0 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20  equent .** call 
33bd0 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d  the nBytes param
33be0 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
33bf0 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
33c00 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a   the same blob.*
33c10 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75  * of memory retu
33c20 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73  rned. .**.** Jus
33c30 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61  t before the sha
33c40 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f  red-btree is clo
33c50 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
33c60 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
33c70 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65  .** xFree argume
33c80 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f  nt when the memo
33c90 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61  ry allocation wa
33ca0 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65  s made is invoke
33cb0 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f  d on the .** blo
33cc0 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d  b of allocated m
33cd0 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63  emory. This func
33ce0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
33cf0 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65 28  call sqliteFree(
33d00 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f  ).** on the memo
33d10 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c 61  ry, the btree la
33d20 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a  yer does that..*
33d30 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  /.void *sqlite3B
33d40 74 72 65 65 53 63 68 65 6d 61 28 42 74 72 65 65  treeSchema(Btree
33d50 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c   *p, int nBytes,
33d60 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76 6f   void(*xFree)(vo
33d70 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61 72  id *)){.  BtShar
33d80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
33d90 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53  ;.  if( !pBt->pS
33da0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74  chema ){.    pBt
33db0 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ->pSchema = sqli
33dc0 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29  teMalloc(nBytes)
33dd0 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65  ;.    pBt->xFree
33de0 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a  Schema = xFree;.
33df0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 74    }.  return pBt
33e00 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a  ->pSchema;.}../*
33e10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
33e20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20  if another user 
33e30 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72  of the same shar
33e40 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20  ed btree as the 
33e50 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64  argument.** hand
33e60 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  le holds an excl
33e70 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
33e80 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
33e90 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
33ea0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
33eb0 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  Locked(Btree *p)
33ec0 7b 0a 20 20 72 65 74 75 72 6e 20 28 71 75 65 72  {.  return (quer
33ed0 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  yTableLock(p, MA
33ee0 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
33ef0 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)!=SQLITE_OK
33f00 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
33f10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
33f20 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62  D_CACHE./*.** Ob
33f30 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  tain a lock on t
33f40 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72  he table whose r
33f50 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62  oot page is iTab
33f60 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69  .  The.** lock i
33f70 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  s a write lock i
33f80 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73  f isWritelock is
33f90 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20   true or a read 
33fa0 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73  lock.** if it is
33fb0 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73   false..*/.int s
33fc0 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54  qlite3BtreeLockT
33fd0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
33fe0 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72  nt iTab, u8 isWr
33ff0 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  iteLock){.  int 
34000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34010 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20    u8 lockType = 
34020 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49  (isWriteLock?WRI
34030 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43  TE_LOCK:READ_LOC
34040 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75 65 72 79  K);.  rc = query
34050 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
34060 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
34070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34080 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  K ){.    rc = lo
34090 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c  ckTable(p, iTab,
340a0 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 7d 0a   lockType);.  }.
340b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
340c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
340d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 62 75 67   following debug
340e0 67 69 6e 67 20 69 6e 74 65 72 66 61 63 65 20 68  ging interface h
340f0 61 73 20 74 6f 20 62 65 20 69 6e 20 74 68 69 73  as to be in this
34100 20 66 69 6c 65 20 28 72 61 74 68 65 72 0a 2a 2a   file (rather.**
34110 20 74 68 61 6e 20 69 6e 2c 20 66 6f 72 20 65 78   than in, for ex
34120 61 6d 70 6c 65 2c 20 74 65 73 74 31 2e 63 29 20  ample, test1.c) 
34130 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 67  so that it can g
34140 65 74 20 61 63 63 65 73 73 20 74 6f 0a 2a 2a 20  et access to.** 
34150 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  the definition o
34160 66 20 42 74 53 68 61 72 65 64 2e 0a 2a 2f 0a 23  f BtShared..*/.#
34170 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
34180 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
34190 6e 65 64 28 54 43 4c 53 48 29 0a 23 69 6e 63 6c  ned(TCLSH).#incl
341a0 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20  ude <tcl.h>.int 
341b0 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63  sqlite3_shared_c
341c0 61 63 68 65 5f 72 65 70 6f 72 74 28 0a 20 20 76  ache_report(.  v
341d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
341e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
341f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
34200 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
34210 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
34220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34230 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
34240 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61    const ThreadDa
34250 74 61 20 2a 70 54 64 20 3d 20 73 71 6c 69 74 65  ta *pTd = sqlite
34260 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
34270 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 64  nly();.  if( pTd
34280 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
34290 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
342a0 2a 70 42 74 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  *pBt;.    Tcl_Ob
342b0 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
342c0 77 4f 62 6a 28 29 3b 0a 20 20 20 20 66 6f 72 28  wObj();.    for(
342d0 70 42 74 3d 70 54 64 2d 3e 70 42 74 72 65 65 3b  pBt=pTd->pBtree;
342e0 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
342f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 6f 6e  Next){.      con
34300 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
34310 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
34320 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
34330 72 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  r);.      Tcl_Li
34340 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
34350 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
34360 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
34370 6a 28 7a 46 69 6c 65 2c 20 2d 31 29 29 3b 0a 20  j(zFile, -1));. 
34380 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
34390 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
343a0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
343b0 4e 65 77 49 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e  NewIntObj(pBt->n
343c0 52 65 66 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref));.    }.   
343d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
343e0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
343f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
34400 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
34410 65 6e 64 69 66 0a                                endif.