/ Hex Artifact Content
Login

Artifact 9b41229e7ff4b0fe8556763ce2b466a90aaaa6a4:


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 36 20 32 30 30 37 2f 30  c,v 1.346 2007/0
0190: 33 2f 33 30 20 31 31 3a 31 32 3a 30 38 20 64 72  3/30 11:12:08 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 72 6f  s..**.** This ro
14280 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
14290 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
142a0 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
142b0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
142c0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
142d0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
142e0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
142f0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
14300 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
14310 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
14320 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
14330 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
14340 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
14350 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
14360 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
14370 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
14380 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
14390 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
143a0 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
143b0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
143c0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
143d0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
143e0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
143f0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
14400 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
14410 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
14420 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
14430 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
14440 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
14450 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
14460 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
14470 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
14480 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
14490 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
144a0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
144b0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
144c0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
144d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
144e0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
144f0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
14500 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14510 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
14520 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
14530 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
14540 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14550 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
14560 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
14570 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
14580 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
14590 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
145a0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
145b0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
145c0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
145d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
145e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
145f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14600 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
14610 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
14620 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
14630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14640 50 61 67 65 72 43 6f 6d 6d 69 74 28 70 42 74 2d  PagerCommit(pBt-
14650 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
14660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14670 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14680 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
14690 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
146a0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
146b0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
146c0 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
146d0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
146e0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
146f0 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
14700 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
14710 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
14720 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
14730 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
14740 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
14750 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14760 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
14770 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
14780 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
14790 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
147a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
147b0 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
147c0 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
147d0 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
147e0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
147f0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
14800 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
14810 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
14820 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
14830 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
14840 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14850 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
14860 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14870 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
14880 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
14890 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
148a0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
148b0 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
148c0 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
148d0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
148e0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
148f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
14900 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
14910 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
14920 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14930 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
14940 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72  ntegrity(p);.  r
14950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14960 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
14970 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
14980 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
14990 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
149a0 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
149b0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
149c0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
149d0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
149e0 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
149f0 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
14a00 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
14a10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
14a20 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
14a30 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14a40 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14a50 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
14a60 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
14a70 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
14a80 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
14a90 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
14aa0 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20  wrFlag ) r++; . 
14ab0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
14ac0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
14ad0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
14ae0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
14af0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
14b00 20 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e 67   Print debugging
14b10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
14b20 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74  ut all cursors t
14b30 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
14b40 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14b50 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73  e3BtreeCursorLis
14b60 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  t(Btree *p){.  B
14b70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
14b80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14b90 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28 70   p->pBt;.  for(p
14ba0 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
14bb0 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
14bc0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4d  r->pNext){.    M
14bd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
14be0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
14bf0 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 70   char *zMode = p
14c00 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22 72  Cur->wrFlag ? "r
14c10 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20 73  w" : "ro";.    s
14c20 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
14c30 66 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f 6f  f("CURSOR %p roo
14c40 74 65 64 20 61 74 20 25 34 64 28 25 73 29 20 63  ted at %4d(%s) c
14c50 75 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e 25  urrently at %d.%
14c60 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70  d%s\n",.       p
14c70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  Cur, pCur->pgnoR
14c80 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20  oot, zMode,.    
14c90 20 20 20 70 50 61 67 65 20 3f 20 70 50 61 67 65     pPage ? pPage
14ca0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75 72  ->pgno : 0, pCur
14cb0 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28 70  ->idx,.       (p
14cc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
14cd0 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22 20  SOR_VALID) ? "" 
14ce0 3a 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b 0a  : " eof".    );.
14cf0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
14d00 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
14d10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
14d20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
14d30 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
14d40 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
14d50 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
14d60 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
14d70 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
14d80 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
14d90 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
14da0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
14db0 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
14dc0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
14dd0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
14de0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
14df0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
14e00 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
14e10 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
14e20 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
14e30 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
14e40 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
14e50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14e60 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
14e70 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
14e80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14e90 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
14ea0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72 63  e *pPage1;..  rc
14eb0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
14ec0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69  s(pBt, 0, 0);.#i
14ed0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ee0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
14ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14f00 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  OK ){.    /* Thi
14f10 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20  s is a horrible 
14f20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f  situation. An IO
14f30 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
14f40 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
14f50 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
14f60 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
14f70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
14f80 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
14f90 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
14fa0 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
14fb0 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
14fc0 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
14fd0 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
14fe0 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
14ff0 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
15000 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
15010 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
15020 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
15030 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
15040 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
15050 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
15060 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
15070 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
15080 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
15090 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
150a0 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
150b0 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
150c0 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
150d0 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
150e0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
150f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42  sqlite3 *db = pB
15100 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72  t->pCursor->pBtr
15110 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20  ee->pSqlite;.   
15120 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20     if( db ){.   
15130 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72       sqlite3Abor
15140 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65  tOtherActiveVdbe
15150 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
15160 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
15170 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  if.  btreeIntegr
15180 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b  ity(p);.  unlock
15190 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
151a0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
151b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
151c0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
151d0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
151e0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
151f0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
15200 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
15210 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
15220 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15230 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
15240 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
15250 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
15260 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
15270 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
15280 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
15290 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
152a0 20 20 20 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61     ** call getPa
152b0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
152c0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72  gain to make sur
152d0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
152e0 69 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 63 6f  is.    ** set co
152f0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
15300 69 66 28 20 67 65 74 50 61 67 65 28 70 42 74 2c  if( getPage(pBt,
15310 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
15320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15330 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15340 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
15350 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
15360 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
15370 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
15380 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15390 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
153a0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
153b0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
153c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
153d0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
153e0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
153f0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
15400 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
15410 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
15420 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15430 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
15440 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
15450 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
15460 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
15470 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
15480 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15490 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
154a0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
154b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
154c0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
154d0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
154e0 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62  action.  The sub
154f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a  transaction can.
15500 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
15510 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
15520 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
15530 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
15540 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
15550 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66   transaction bef
15560 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
15570 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  ubtransaction..*
15580 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  * The subtransac
15590 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
155a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74  tomatically if t
155b0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
155c0 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f  ion.** commits o
155d0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
155e0 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62  .** Only one sub
155f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
15600 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74  be active at a t
15610 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65  ime.  It is an e
15620 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74  rror to try.** t
15630 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75  o start a new su
15640 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20  btransaction if 
15650 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73  another subtrans
15660 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
15670 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  y active..**.** 
15680 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
15690 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
156a0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
156b0 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
156c0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
156d0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
156e0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
156f0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
15700 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
15710 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
15720 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
15730 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
15740 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
15750 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
15760 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
15770 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
15780 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
15790 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
157a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
157b0 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  inStmt(Btree *p)
157c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
157d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
157e0 3e 70 42 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e  >pBt;.  if( (p->
157f0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
15800 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e  RITE) || pBt->in
15810 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Stmt ){.    retu
15820 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
15830 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
15840 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
15850 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
15860 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15870 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
15880 20 29 3b 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e   );.  rc = pBt->
15890 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
158a0 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61  E_OK : sqlite3Pa
158b0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74  gerStmtBegin(pBt
158c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74  ->pPager);.  pBt
158d0 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
158e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
158f0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
15900 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e  statment subtran
15910 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
15920 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  y in progress.  
15930 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e  If no.** subtran
15940 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
15950 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  e, this is a no-
15960 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
15970 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
15980 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
15990 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
159a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
159b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
159c0 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
159d0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
159e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
159f0 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61  tCommit(pBt->pPa
15a00 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
15a10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15a20 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e  K;.  }.  pBt->in
15a30 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  Stmt = 0;.  retu
15a40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15a50 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74  Rollback the act
15a60 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  ive statement su
15a70 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49  btransaction.  I
15a80 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74  f no subtransact
15a90 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65  ion.** is active
15aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15ab0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
15ac0 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
15ad0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
15ae0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
15af0 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a  n.  Any attempt.
15b00 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  ** to use a curs
15b10 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
15b20 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
15b30 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
15b40 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75  ion.** will resu
15b50 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
15b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15b70 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
15b80 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
15b90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ba0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15bb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
15bc0 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c  ite3MallocDisall
15bd0 6f 77 28 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  ow();.  if( pBt-
15be0 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d  >inStmt && !pBt-
15bf0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
15c00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15c10 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70  erStmtRollback(p
15c20 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
15c30 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
15c40 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
15c50 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
15c60 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
15c70 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c   sqlite3MallocAl
15c80 6c 6f 77 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  low();.  return 
15c90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  rc;.}../*.** Def
15ca0 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69  ault key compari
15cb0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  son function to 
15cc0 62 65 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f  be used if no co
15cd0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
15ce0 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65  n.** is specifie
15cf0 64 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33  d on the sqlite3
15d00 42 74 72 65 65 43 75 72 73 6f 72 28 29 20 63 61  BtreeCursor() ca
15d10 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
15d20 74 20 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20  t dfltCompare(. 
15d30 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20   void *NotUsed, 
15d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
15d50 73 65 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20  ser data is not 
15d60 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31  used */.  int n1
15d70 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31  , const void *p1
15d80 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65  ,    /* First ke
15d90 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
15da0 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20    int n2, const 
15db0 76 6f 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20  void *p2     /* 
15dc0 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f  Second key to co
15dd0 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mpare */.){.  in
15de0 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d  t c;.  c = memcm
15df0 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20  p(p1, p2, n1<n2 
15e00 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66  ? n1 : n2);.  if
15e10 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20  ( c==0 ){.    c 
15e20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20  = n1 - n2;.  }. 
15e30 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
15e40 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
15e50 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
15e60 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
15e70 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
15e80 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20  ** iTable.  The 
15e90 61 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67  act of acquiring
15ea0 20 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61   a cursor gets a
15eb0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a   read lock on .*
15ec0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
15ed0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ile..**.** If wr
15ee0 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
15ef0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
15f00 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
15f10 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
15f20 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
15f30 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
15f40 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
15f50 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
15f60 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
15f70 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
15f80 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
15f90 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
15fa0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
15fb0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
15fc0 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
15fd0 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
15fe0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
15ff0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
16000 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
16010 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
16020 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
16030 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16040 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
16050 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
16060 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
16070 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
16080 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
16090 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
160a0 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
160b0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
160c0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
160d0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
160e0 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
160f0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
16100 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
16110 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
16120 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
16130 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
16140 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
16150 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16160 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
16170 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
16180 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
16190 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
161a0 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
161b0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
161c0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
161d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
161e0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
161f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
16200 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
16210 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
16220 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
16230 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
16240 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
16250 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
16260 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
16270 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rectly..**.** Th
16280 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
16290 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f  ction must be lo
162a0 67 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  gically the same
162b0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
162c0 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63  r.** on a partic
162d0 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61  ular table.  Cha
162e0 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  nging the compar
162f0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69  ison function wi
16300 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
16310 69 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  incorrect operat
16320 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f  ions.  If the co
16330 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
16340 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20  n is NULL, a.** 
16350 64 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73  default comparis
16360 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  on function is u
16370 73 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72  sed.  The compar
16380 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  ison function is
16390 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72  .** always ignor
163a0 65 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61  ed for INTKEY ta
163b0 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  bles..*/.int sql
163c0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
163d0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16400 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
16410 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16440 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
16450 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
16460 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16490 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
164a0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  d-only */.  int 
164b0 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e  (*xCmp)(void*,in
164c0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
164d0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20  t,const void*), 
164e0 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f  /* Key Compariso
164f0 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64  n func */.  void
16500 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16530 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
16540 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
16550 20 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20 20   **ppCur        
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
16580 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
16590 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
165a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
165b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
165c0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43   p->pBt;..  *ppC
165d0 75 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72  ur = 0;.  if( wr
165e0 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
165f0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
16600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16610 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
16620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
16630 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
16640 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
16650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16660 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  _LOCKED;.    }. 
16670 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
16680 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
16690 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
166a0 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
166b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
166c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
166d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
166e0 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d    pCur = sqliteM
166f0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
16700 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
16710 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ur==0 ){.    rc 
16720 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16730 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
16740 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
16750 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67  ;.  }.  pCur->pg
16760 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
16770 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61  Table;.  if( iTa
16780 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  ble==1 && sqlite
16790 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
167a0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
167b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
167c0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f  TE_EMPTY;.    go
167d0 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
167e0 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
167f0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
16800 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
16810 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
16820 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  ->pPage, 0);.  i
16830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16840 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65   ){.    goto cre
16850 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
16860 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
16870 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
16880 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
16890 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
168a0 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
168b0 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
168c0 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  s, link the curs
168d0 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
168e0 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65  ared list and se
168f0 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20  t *ppCur (the.  
16900 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65  ** output argume
16910 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
16920 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  ion)..  */.  pCu
16930 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43  r->xCompare = xC
16940 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74  mp ? xCmp : dflt
16950 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d  Compare;.  pCur-
16960 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  >pArg = pArg;.  
16970 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
16980 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
16990 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
169a0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
169b0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
169c0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
169d0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
169e0 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
169f0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
16a00 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
16a10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
16a20 49 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75  INVALID;.  *ppCu
16a30 72 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74  r = pCur;..  ret
16a40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63  urn SQLITE_OK;.c
16a50 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
16a60 65 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43  eption:.  if( pC
16a70 75 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  ur ){.    releas
16a80 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
16a90 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
16aa0 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ee(pCur);.  }.  
16ab0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
16ac0 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
16ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20  rn rc;.}..#if 0 
16ae0 20 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a   /* Not Used */.
16af0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16b00 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
16b10 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
16b20 6e 20 75 73 65 64 20 62 79 20 61 20 63 75 72 73  n used by a curs
16b30 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
16b40 74 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61  te3BtreeSetCompa
16b50 72 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  re(.  BtCursor *
16b60 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65  pCur,     /* The
16b70 20 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65   cursor to whose
16b80 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16b90 74 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20  tion is changed 
16ba0 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28  */.  int(*xCmp)(
16bb0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
16bc0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
16bd0 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63  void*), /* New c
16be0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a  omparison func *
16bf0 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
16c00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16c10 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d   argument to xCm
16c20 70 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72  p() */.){.  pCur
16c30 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
16c40 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
16c50 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
16c60 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23  pArg = pArg;.}.#
16c70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
16c80 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
16c90 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
16ca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16cb0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
16cc0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
16cd0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
16ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16cf0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
16d00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
16d10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16d20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
16d30 70 42 74 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72  pBt;.  restoreOr
16d40 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
16d50 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ion(pCur, 0);.  
16d60 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
16d70 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72  ){.    pCur->pPr
16d80 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
16d90 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
16da0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  {.    pBt->pCurs
16db0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
16dc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
16dd0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16de0 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
16df0 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
16e00 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
16e10 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ge(pCur->pPage);
16e20 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
16e30 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 73  Unused(pBt);.  s
16e40 71 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b  qliteFree(pCur);
16e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16e60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
16e70 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  ke a temporary c
16e80 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67  ursor by filling
16e90 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f   in the fields o
16ea0 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54  f pTempCur..** T
16eb0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72  he temporary cur
16ec0 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68  sor is not on th
16ed0 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f  e cursor list fo
16ee0 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a  r the Btree..*/.
16ef0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 54  static void getT
16f00 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
16f10 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
16f20 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
16f30 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
16f40 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a  , pCur, sizeof(*
16f50 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  pCur));.  pTempC
16f60 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
16f70 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
16f80 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d   = 0;.  if( pTem
16f90 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
16fa0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
16fb0 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
16fc0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
16fd0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
16fe0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
16ff0 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
17000 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
17010 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
17020 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
17030 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
17040 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65  c void releaseTe
17050 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
17060 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
17070 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
17080 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
17090 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65  nref(pCur->pPage
170a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
170b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
170c0 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  re the BtCursor.
170d0 69 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68  info field of th
170e0 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69  e given cursor i
170f0 73 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69  s valid..** If i
17100 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
17110 20 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72   valid, call par
17120 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
17130 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
17140 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
17150 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
17160 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
17170 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
17180 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
17190 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
171a0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
171b0 6f 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  o parseCell()..*
171c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
171d0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
171e0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
171f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
17200 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73  e==0 ){.    pars
17210 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
17220 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
17230 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
17240 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  lse{.#ifndef NDE
17250 42 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  BUG.    CellInfo
17260 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65   info;.    memse
17270 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
17280 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70  of(info));.    p
17290 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
172a0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
172b0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
172c0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
172d0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
172e0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
172f0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d   );.#endif.  }.}
17300 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
17310 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
17320 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
17330 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
17340 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
17350 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
17360 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
17370 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
17380 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
17390 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
173a0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
173b0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
173c0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
173d0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
173e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
173f0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
17400 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
17410 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17420 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69  in the key..*/.i
17430 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
17440 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
17450 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
17460 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  e){.  int rc = r
17470 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
17480 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
17490 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
174a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
174b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
174c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
174d0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
174e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
174f0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
17500 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
17510 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
17520 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
17530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17540 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
17550 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
17560 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
17570 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
17580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17590 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
175a0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
175b0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
175c0 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
175d0 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
175e0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
175f0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
17600 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
17610 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
17620 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
17630 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
17640 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
17650 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
17660 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
17670 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
17680 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
17690 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
176a0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
176b0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
176c0 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
176d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
176e0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
176f0 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72  t rc = restoreOr
17700 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
17710 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20  ion(pCur, 1);.  
17720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17730 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
17740 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17750 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
17760 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
17770 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
17780 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
17790 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
177a0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
177b0 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
177c0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
177d0 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
177e0 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
177f0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
17800 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
17810 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
17820 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
17830 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
17840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
17860 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
17870 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
17880 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
17890 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70 6f   cursor is.** po
178a0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65 67 69  inting to.  Begi
178b0 6e 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  n reading the pa
178c0 79 6c 6f 61 64 20 61 74 20 22 6f 66 66 73 65 74  yload at "offset
178d0 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61 20  " and read.** a 
178e0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
178f0 79 74 65 73 2e 20 20 50 75 74 20 74 68 65 20 72  ytes.  Put the r
17900 65 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a 2a  esult in zBuf..*
17910 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17920 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
17930 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65  a distinction be
17940 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  tween key and da
17950 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72  ta..** It just r
17960 65 61 64 73 20 62 79 74 65 73 20 66 72 6f 6d 20  eads bytes from 
17970 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
17980 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 61 70  .  Data might ap
17990 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  pear.** on the m
179a0 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
179b0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
179c0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
179d0 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  w pages..*/.stat
179e0 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f 61  ic int getPayloa
179f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
17a00 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
17a10 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
17a20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
17a30 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  om */.  int offs
17a40 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
17a50 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
17a60 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
17a70 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  oad */.  int amt
17a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17a90 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
17aa0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
17ab0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
17ac0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
17ad0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
17ae0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
17af0 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
17b00 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
17b10 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
17b20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
17b30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
17b40 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20  Payload;.  Pgno 
17b50 6e 65 78 74 50 61 67 65 3b 0a 20 20 69 6e 74 20  nextPage;.  int 
17b60 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
17b70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
17b80 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76 66   *pBt;.  int ovf
17b90 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b 65  lSize;.  u32 nKe
17ba0 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  y;..  assert( pC
17bb0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ur!=0 && pCur->p
17bc0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
17bd0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
17be0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
17bf0 29 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d  );.  pBt = pCur-
17c00 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20  >pBtree->pBt;.  
17c10 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
17c20 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
17c30 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
17c40 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
17c50 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
17c60 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
17c70 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
17c80 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
17c90 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
17ca0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
17cb0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
17cc0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
17cd0 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
17ce0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
17cf0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
17d00 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 6b 69  >=0 );.  if( ski
17d10 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73  pKey ){.    offs
17d20 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  et += nKey;.  }.
17d30 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
17d40 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
17d50 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  fo.nData ){.    
17d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
17d70 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
17d80 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
17d90 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
17da0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
17db0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
17dc0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
17dd0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
17de0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
17df0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
17e00 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
17e10 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
17e20 2c 20 61 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  , a);.    if( a=
17e30 3d 61 6d 74 20 29 7b 0a 20 20 20 20 20 20 72 65  =amt ){.      re
17e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17e50 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 73 65 74      }.    offset
17e60 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
17e70 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
17e80 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
17e90 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
17ea0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
17eb0 0a 20 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  .  ovflSize = pB
17ec0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
17ed0 34 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29  4;.  if( amt>0 )
17ee0 7b 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  {.    nextPage =
17ef0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
17f00 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
17f10 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20 20 77 68 69  Local]);.    whi
17f20 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 6e 65 78  le( amt>0 && nex
17f30 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 44  tPage ){.      D
17f40 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
17f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17f60 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
17f70 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
17f80 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
17f90 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
17fa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17fb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
17fc0 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
17fd0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
17fe0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17ff0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
18000 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
18010 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c       if( offset<
18020 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
18030 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
18040 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
18050 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
18060 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
18070 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
18080 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
18090 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
180a0 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b  pBuf, &aPayload[
180b0 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b 0a 20  offset+4], a);. 
180c0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
180d0 30 3b 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d  0;.        amt -
180e0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
180f0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 65  f += a;.      }e
18100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 66 66  lse{.        off
18110 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
18120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
18130 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
18140 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  (pDbPage);.    }
18150 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e  .  }..  if( amt>
18160 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18170 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18180 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
18190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
181a0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
181b0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
181c0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
181d0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
181e0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
181f0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
18200 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
18210 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
18220 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
18230 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
18240 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18250 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18260 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18270 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18280 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18290 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
182a0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
182b0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
182c0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
182d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
182e0 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
182f0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
18300 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18310 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
18320 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
18330 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
18340 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
18350 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18370 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18380 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
18390 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
183a0 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20  pPage!=0 );.    
183b0 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  if( pCur->pPage-
183c0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
183d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
183e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
183f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
18400 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
18410 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ey==0 );.    ass
18420 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
18430 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
18440 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
18450 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  l );.    rc = ge
18460 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  tPayload(pCur, o
18470 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
18480 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
18490 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
184a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
184b0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
184c0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
184d0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
184e0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
184f0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18500 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18510 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18520 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18530 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18540 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18550 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18560 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
18570 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
18580 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
18590 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
185a0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
185b0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
185c0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
185d0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
185e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
185f0 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
18600 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18610 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18620 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pBuf){.  int rc 
18630 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18640 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18650 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  Cur, 1);.  if( r
18660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18670 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18680 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18690 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
186a0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
186b0 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e!=0 );.    asse
186c0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
186d0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
186e0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
186f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
18700 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18710 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
18720 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
18730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
18740 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18750 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
18760 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
18770 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
18780 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
18790 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
187a0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
187b0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
187c0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
187d0 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
187e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
187f0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
18800 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
18810 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
18820 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
18830 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
18840 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
18850 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
18860 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
18870 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
18880 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
18890 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
188a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
188b0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
188c0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
188d0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
188e0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
188f0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
18900 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
18910 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
18920 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
18930 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
18940 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
18950 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
18960 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
18970 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
18980 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
18990 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
189a0 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
189b0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
189c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
189d0 65 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20  en getPayload() 
189e0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
189f0 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68  reassembly.** th
18a00 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
18a10 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
18a20 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
18a30 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
18a40 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
18a50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
18a60 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
18a70 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
18a80 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
18a90 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
18aa0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
18ab0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
18ac0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
18ad0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
18ae0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
18af0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18b00 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
18b10 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18b20 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
18b30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
18b40 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
18b50 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
18b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
18b70 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
18b80 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
18b90 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
18ba0 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
18bb0 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
18bc0 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
18bd0 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
18be0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18bf0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
18c00 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
18c10 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  32 nKey;.  int n
18c20 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
18c30 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
18c40 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  r->pPage!=0 );. 
18c50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18c60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18c70 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  LID );.  pPage =
18c80 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
18c90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
18ca0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
18cb0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
18cc0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
18cd0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
18ce0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
18cf0 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
18d00 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
18d10 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
18d20 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
18d30 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
18d40 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
18d50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
18d60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
18d70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
18d80 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
18d90 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
18da0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
18db0 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
18dc0 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
18dd0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
18de0 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79   if( nLocal>nKey
18df0 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c   ){.      nLocal
18e00 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20   = nKey;.    }. 
18e10 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
18e20 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
18e30 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
18e40 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
18e50 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
18e60 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
18e70 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
18e80 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
18e90 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
18ea0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
18eb0 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
18ec0 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
18ed0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
18ee0 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
18ef0 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
18f00 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
18f10 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
18f20 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
18f30 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
18f40 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
18f50 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
18f60 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
18f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
18f80 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
18f90 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
18fa0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
18fb0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
18fc0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
18fd0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
18fe0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
18ff0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
19000 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
19010 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19020 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28  nt *pAmt){.  if(
19030 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19040 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
19050 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
19060 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
19070 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
19080 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
19090 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64   0;.}.const void
190a0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
190b0 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
190c0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
190d0 74 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  t){.  if( pCur->
190e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
190f0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
19100 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
19110 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
19120 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
19130 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19140 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19150 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
19160 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
19170 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
19180 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
19190 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
191a0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
191b0 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74  o move to..*/.st
191c0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
191d0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
191e0 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
191f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
19200 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
19210 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c  ;.  MemPage *pOl
19220 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  dPage;.  BtShare
19230 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
19240 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61  Btree->pBt;..  a
19250 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19260 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19270 44 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41  D );.  rc = getA
19280 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
19290 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
192a0 67 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29  ge, pCur->pPage)
192b0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
192c0 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61  urn rc;.  pNewPa
192d0 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  ge->idxParent = 
192e0 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c  pCur->idx;.  pOl
192f0 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  dPage = pCur->pP
19300 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d  age;.  pOldPage-
19310 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
19320 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c   releasePage(pOl
19330 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  dPage);.  pCur->
19340 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65  pPage = pNewPage
19350 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
19360 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
19370 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
19380 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
19390 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <1 ){.    return
193a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
193b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
193c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
193d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
193e0 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
193f0 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  s the virtual ro
19400 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e  ot of its table.
19410 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75  .**.** The virtu
19420 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
19430 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f  the root page fo
19440 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20  r most tables.  
19450 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74  But.** for the t
19460 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70  able rooted on p
19470 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20  age 1, sometime 
19480 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61  the real root pa
19490 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65  ge.** is empty e
194a0 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69  xcept for the ri
194b0 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e  ght-pointer.  In
194c0 20 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a   such cases the.
194d0 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
194e0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
194f0 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
19500 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a  pointer of page.
19510 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67  ** 1 is pointing
19520 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   to..*/.static i
19530 6e 74 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65  nt isRootPage(Me
19540 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
19550 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
19560 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
19570 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e  nt;.  if( pParen
19580 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  t==0 ) return 1;
19590 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
195a0 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20  pgno>1 ) return 
195b0 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74  0;.  if( get2byt
195c0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
195d0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
195e0 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65  fset+3])==0 ) re
195f0 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
19600 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
19610 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
19620 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
19630 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
19640 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
19650 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
19660 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
19670 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
19680 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
19690 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
196a0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
196b0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
196c0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
196d0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
196e0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
196f0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
19700 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
19710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
19720 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
19730 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
19740 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
19750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
19760 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65  e;.  int idxPare
19770 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  nt;..  assert( p
19780 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19790 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
197a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
197b0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
197c0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
197d0 72 74 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28  rt( !isRootPage(
197e0 70 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72  pPage) );.  pPar
197f0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
19800 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20  rent;.  assert( 
19810 70 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20  pParent!=0 );.  
19820 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67  idxParent = pPag
19830 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20  e->idxParent;.  
19840 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
19850 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
19860 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
19870 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  (pPage);.  pCur-
19880 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74  >pPage = pParent
19890 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
198a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
198b0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78  rt( pParent->idx
198c0 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43  Shift==0 );.  pC
198d0 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72  ur->idx = idxPar
198e0 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ent;.}../*.** Mo
198f0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
19900 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   the root page.*
19910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
19920 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
19930 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
19940 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
19950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19960 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19970 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
19980 3e 70 42 74 3b 0a 0a 20 20 72 65 73 74 6f 72 65  >pBt;..  restore
19990 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
199a0 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a  ition(pCur, 0);.
199b0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
199c0 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f  pPage;.  if( pRo
199d0 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e  ot && pRoot->pgn
199e0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
199f0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
19a00 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29   pRoot->isInit )
19a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19a20 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  f( .      SQLITE
19a30 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e  _OK!=(rc = getAn
19a40 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
19a50 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
19a60 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29  pRoot, 0)).    )
19a70 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
19a80 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
19a90 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
19aa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19ab0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
19ac0 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
19ad0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52  pCur->pPage = pR
19ae0 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  oot;.  }.  pCur-
19af0 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
19b00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
19b10 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
19b20 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
19b30 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
19b40 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
19b50 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
19b60 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
19b70 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
19b80 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
19b90 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
19ba0 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
19bb0 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
19bc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
19bd0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
19be0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
19bf0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
19c00 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ge);.  }.  pCur-
19c10 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72  >eState = ((pCur
19c20 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
19c30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
19c40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
19c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19c60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19c70 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
19c80 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
19c90 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
19ca0 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
19cb0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
19cc0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
19cd0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
19ce0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
19cf0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
19d00 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
19d10 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
19d20 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
19d30 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19d40 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
19d50 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
19d60 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b   pgno;.  int rc;
19d70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
19d80 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  e;..  assert( pC
19d90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19da0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
19db0 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70  ile( !(pPage = p
19dc0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
19dd0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
19de0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
19df0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
19e00 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
19e10 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
19e20 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
19e30 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
19e40 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
19e50 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
19e60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19e70 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
19e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19e90 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19ea0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
19eb0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
19ec0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
19ed0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
19ee0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
19ef0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
19f00 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
19f10 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
19f20 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
19f30 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
19f40 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
19f50 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
19f60 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
19f70 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
19f80 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
19f90 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
19fa0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
19fb0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
19fc0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
19fd0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
19fe0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
19ff0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1a000 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1a010 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1a020 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1a030 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1a040 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1a050 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1a060 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a070 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pgno;.  int rc;.
1a080 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a090 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1a0a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a0b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a0c0 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
1a0d0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1a0e0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1a0f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1a100 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1a110 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1a120 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
1a130 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
1a140 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1a150 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1a160 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a170 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1a180 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
1a190 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ll - 1;.  pCur->
1a1a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1a1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a1c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
1a1d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1a1e0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1a1f0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1a200 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1a210 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1a220 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1a230 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1a240 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1a250 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1a260 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1a270 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1a280 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1a290 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1a2a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1a2b0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1a2c0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1a2d0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1a2e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1a2f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1a300 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1a310 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
1a320 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1a330 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1a340 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1a350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a360 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1a370 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1a380 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  l>0 );.  *pRes =
1a390 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   0;.  rc = moveT
1a3a0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1a3b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a3c0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1a3d0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1a3e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a3f0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a400 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a410 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a420 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a430 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a440 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a450 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a460 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a470 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1a490 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1a4a0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1a4b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
1a4c0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1a4d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1a4e0 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 43  turn rc;.  if( C
1a4f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1a500 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1a510 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1a520 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
1a530 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
1a540 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1a550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1a560 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1a570 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1a580 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
1a590 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1a5a0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1a5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a5c0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a5d0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1a5e0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1a5f0 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e   near pKey/nKey.
1a600 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63  .** Return a suc
1a610 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
1a620 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
1a630 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  es, only the nKe
1a640 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1a650 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
1a660 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f   ignored.  For o
1a670 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65  ther tables, nKe
1a680 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  y is the number 
1a690 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1a6a0 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20 54 68  .** in pKey.  Th
1a6b0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
1a6c0 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
1a6d0 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1a6e0 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69  was.** created i
1a6f0 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
1a700 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  e keys..**.** If
1a710 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
1a720 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
1a730 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1a740 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
1a750 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
1a760 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
1a770 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
1a780 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
1a790 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
1a7a0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
1a7b0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
1a7c0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
1a7d0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
1a7e0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  key..**.** The r
1a7f0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1a800 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
1a810 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
1a820 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ch the.** cursor
1a830 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
1a840 70 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55  pRes if pRes!=NU
1a850 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  LL.  The meaning
1a860 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75   of.** this valu
1a870 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
1a880 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1a890 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1a8a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1a8b0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1a8c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1a8d0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1a8e0 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72  ler than pKey or
1a8f0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1a900 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
1a910 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
1a920 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
1a930 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
1a940 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
1a950 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
1a960 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1a970 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1a980 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1a990 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1a9a0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
1a9b0 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a  tches pKey..**.*
1a9c0 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
1a9d0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1a9e0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1a9f0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1aa00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1aa10 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
1aa20 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  an pKey..*/.int 
1aa30 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1aa40 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1aa50 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  pCur,        /* 
1aa60 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1aa70 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   moved */.  cons
1aa80 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1aa90 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f     /* The key co
1aaa0 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65  ntent for indice
1aab0 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20  s.  Not used by 
1aac0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36 34 20  tables */.  i64 
1aad0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1aae0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b     /* Size of pK
1aaf0 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20  ey.  Or the key 
1ab00 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  for tables */.  
1ab10 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
1ab20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1ab30 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
1ab40 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1ab50 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1ab60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s              /
1ab70 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20  * Search result 
1ab80 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  flag */.){.  int
1ab90 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
1aba0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1abb0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1abc0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rc;.  assert( pC
1abd0 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
1abe0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1abf0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1ac00 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1ac10 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1ac20 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1ac30 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1ac40 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1ac50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1ac60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ac70 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20   }.  for(;;){.  
1ac80 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1ac90 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1aca0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1acb0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1acc0 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d  e;.    int c = -
1acd0 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75  1;  /* pRes retu
1ace0 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65  rn if table is e
1acf0 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20  mpty must be -1 
1ad00 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  */.    lwr = 0;.
1ad10 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
1ad20 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
1ad30 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
1ad40 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   && pKey==0 ){. 
1ad50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ad60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ad70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1ad80 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1ad90 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75 70    pCur->idx = up
1ada0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1adb0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1adc0 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20  (upr+lwr)/2;.   
1add0 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c 3d   }.    if( lwr<=
1ade0 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20  upr ) for(;;){. 
1adf0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
1ae00 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  Key;.      i64 n
1ae10 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70  CellKey;.      p
1ae20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ae30 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1ae40 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1ae50 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c          u8 *pCel
1ae60 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
1ae70 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1ae80 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b 20  e, pCur->idx) + 
1ae90 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
1aea0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
1aeb0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
1aec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
1aed0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
1aee0 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
1aef0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26 64  rint32(pCell, &d
1af00 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
1af10 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
1af20 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20 2a  nt(pCell, (u64 *
1af30 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1af40 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1af50 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  y<nKey ){.      
1af60 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
1af70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
1af80 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20  ellKey>nKey ){. 
1af90 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
1afa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1afb0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1afc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1afd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1afe0 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20  int available;. 
1aff0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1b000 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50  = (void *)fetchP
1b010 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76  ayload(pCur, &av
1b020 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  ailable, 0);.   
1b030 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20       nCellKey = 
1b040 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1b050 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61  .        if( ava
1b060 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79  ilable>=nCellKey
1b070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1b080 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65  = pCur->xCompare
1b090 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65  (pCur->pArg, nCe
1b0a0 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1b0b0 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
1b0c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b0d0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1b0e0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1b0f0 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  w( nCellKey );. 
1b100 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1b110 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  llKey==0 ) retur
1b120 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b130 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b140 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1b150 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1b160 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1b170 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1b180 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1b190 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1b1a0 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1b1b0 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1b1c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
1b1d0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
1b1e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1b1f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b210 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
1b220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1b230 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
1b240 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1b250 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
1b260 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20  pCur->idx;.     
1b270 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d       upr = lwr -
1b280 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
1b290 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1b2a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
1b2b0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1b2c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1b2d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
1b300 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
1b310 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20   pCur->idx+1;.  
1b320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b330 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69     upr = pCur->i
1b340 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1b350 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1b360 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1b370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b380 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72  pCur->idx = (lwr
1b390 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +upr)/2;.    }. 
1b3a0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
1b3b0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
1b3c0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1b3d0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
1b3e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1b3f0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
1b400 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
1b410 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1b420 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1b430 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1b440 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1b450 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1b460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1b470 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1b480 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1b490 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
1b4a0 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
1b4b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b4c0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1b4d0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
1b4e0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
1b4f0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1b500 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1b510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b520 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1b530 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a  Cur->idx = lwr;.
1b540 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1b550 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Size = 0;.    rc
1b560 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1b570 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1b580 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1b590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b5a0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20   }.  }.  /* NOT 
1b5b0 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a  REACHED */.}../*
1b5c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1b5d0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1b5e0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1b5f0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1b600 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1b610 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1b620 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1b630 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1b640 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1b650 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1b660 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1b670 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1b680 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1b690 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1b6a0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1b6b0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1b6c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1b6d0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1b6e0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1b6f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1b700 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1b710 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1b720 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1b730 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1b740 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1b750 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1b760 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1b770 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1b780 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1b790 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1b7a0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1b7b0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1b7c0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1b7d0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1b7e0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1b7f0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1b800 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1b810 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1b820 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1b830 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1b840 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1b850 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1b860 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1b870 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1b880 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1b890 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1b8a0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1b8b0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1b8c0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1b8d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b8e0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1b8f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1b900 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1b910 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 23 69  Page *pPage;..#i
1b920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b930 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1b940 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1b950 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1b960 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
1b970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b980 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1b990 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
1b9a0 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20  r->skip>0 ){.   
1b9b0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1b9c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1b9d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b9e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1b9f0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23 65 6e 64  ->skip = 0;.#end
1ba00 69 66 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70  if ..  assert( p
1ba10 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  Res!=0 );.  pPag
1ba20 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1ba30 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1ba40 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ba50 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1ba60 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ba70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ba80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1ba90 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1baa0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70  ert( pCur->idx<p
1bab0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
1bac0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
1bad0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1bae0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
1baf0 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  r->idx>=pPage->n
1bb00 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1bb10 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1bb20 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1bb30 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1bb40 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1bb50 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1bb60 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1bb70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1bb80 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1bb90 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1bba0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1bbb0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1bbc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1bbd0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1bbe0 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
1bbf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  ) ){.        *pR
1bc00 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1bc10 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1bc20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1bc30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1bc40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1bc50 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
1bc60 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1bc70 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1bc80 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1bc90 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1bca0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1bcb0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1bcc0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1bcd0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
1bce0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1bcf0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1bd00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bd10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bd20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1bd30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1bd40 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1bd50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1bd60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bd70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1bd80 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1bd90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bda0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
1bdb0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1bdc0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1bdd0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1bde0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1bdf0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1be00 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1be10 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1be20 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1be30 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1be40 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1be50 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1be60 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1be70 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1be80 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1be90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bea0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1beb0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1bec0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1bed0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1bee0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1bef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bf00 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1bf10 45 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  E.  rc = restore
1bf20 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
1bf30 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
1bf40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bf50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1bf60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1bf70 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a  pCur->skip<0 ){.
1bf80 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1bf90 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1bfa0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1bfb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1bfc0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 23  Cur->skip = 0;.#
1bfd0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 43 55 52  endif..  if( CUR
1bfe0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1bff0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1c000 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1c010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c020 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  ;.  }..  pPage =
1c030 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1c040 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1c050 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1c060 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1c070 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
1c080 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
1c090 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69  o = get4byte( fi
1c0a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1c0b0 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20  ur->idx) );.    
1c0c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1c0d0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1c0e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c0f0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
1c100 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1c110 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
1c120 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
1c130 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
1c140 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70  if( isRootPage(p
1c150 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1c160 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1c170 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1c180 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1c190 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1c1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1c1b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
1c1c0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1c1d0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1c1e0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  r->pPage;.    }.
1c1f0 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b      pCur->idx--;
1c200 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1c210 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69  nSize = 0;.    i
1c220 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1c230 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1c240 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1c250 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1c260 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1c270 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c290 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1c2a0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1c2b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c2c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1c2d0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1c2e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1c2f0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1c300 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1c310 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1c320 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
1c330 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
1c340 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1c350 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
1c360 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
1c370 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
1c380 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
1c390 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
1c3a0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
1c3b0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1c3c0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
1c3d0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
1c3e0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1c3f0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1c400 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1c410 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1c420 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1c430 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1c440 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1c450 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1c460 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1c470 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1c480 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1c490 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1c4a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c4b0 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1c4c0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1c4d0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1c4e0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1c4f0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1c500 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1c510 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1c520 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1c530 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1c540 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1c550 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1c560 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1c570 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1c580 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1c590 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1c5a0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1c5b0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1c5c0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1c5d0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1c5e0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1c5f0 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1c600 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
1c610 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
1c620 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
1c630 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
1c640 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1c650 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
1c660 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
1c670 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
1c680 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
1c690 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1c6a0 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
1c6b0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
1c6c0 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
1c6d0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1c6e0 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
1c6f0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
1c700 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1c710 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
1c720 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
1c730 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
1c740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1c750 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1c760 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
1c770 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1c780 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1c790 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
1c7a0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
1c7b0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
1c7c0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1c7d0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1c7e0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1c7f0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
1c800 0a 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ..  pPage1 = pBt
1c810 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20  ->pPage1;.  n = 
1c820 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1c830 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1c840 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
1c850 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
1c860 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1c870 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
1c880 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
1c890 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
1c8a0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
1c8b0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
1c8c0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
1c8d0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
1c8e0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
1c8f0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1c900 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
1c910 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
1c920 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
1c930 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
1c940 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
1c950 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
1c960 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
1c970 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
1c980 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
1c990 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
1c9a0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1c9b0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
1c9c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c9d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c9e0 20 20 20 20 69 66 28 20 65 78 61 63 74 20 29 7b      if( exact ){
1c9f0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
1ca00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1ca10 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
1ca20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
1ca30 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
1ca40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1ca50 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
1ca60 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
1ca70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ca80 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
1ca90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1caa0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
1cab0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
1cac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1cad0 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
1cae0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1caf0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1cb00 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
1cb10 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
1cb20 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
1cb30 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
1cb40 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
1cb50 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
1cb60 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
1cb70 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
1cb80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cb90 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1cba0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1cbb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1cbc0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
1cbd0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1cbe0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
1cbf0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
1cc00 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
1cc10 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
1cc20 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
1cc30 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
1cc40 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
1cc50 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
1cc60 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
1cc70 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
1cc80 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
1cc90 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
1cca0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
1ccb0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1ccc0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
1ccd0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
1cce0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
1ccf0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
1cd00 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1cd10 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1cd20 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
1cd30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
1cd40 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1cd50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1cd60 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
1cd70 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1cd80 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
1cd90 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1cda0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1cdb0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1cdc0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1cdd0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1cde0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
1cdf0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1ce00 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
1ce10 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
1ce20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
1ce30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
1ce40 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
1ce50 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
1ce60 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
1ce70 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
1ce80 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
1ce90 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
1cea0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
1ceb0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
1cec0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
1ced0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
1cee0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
1cef0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
1cf00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1cf10 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1cf20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1cf30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1cf40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cf50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1cf60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cf70 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
1cf80 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1cf90 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1cfa0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
1cfb0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1cfc0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1cfd0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
1cfe0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1cff0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1d000 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1d010 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1d020 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1d030 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
1d040 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62   if( k>pBt->usab
1d050 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
1d060 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1d070 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
1d080 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
1d090 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
1d0a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d0b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d0c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1d0d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1d0e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d0f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d100 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d110 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
1d120 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
1d130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1d140 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
1d150 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
1d160 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
1d170 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1d180 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
1d190 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1d1a0 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
1d1b0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1d1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1d1d0 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
1d1e0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1d1f0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1d200 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1d210 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1d220 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d230 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1d240 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d250 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1d260 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1d270 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1d280 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
1d290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1d2a0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1d2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1d2c0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1d2d0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1d2e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1d2f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1d300 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1d310 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
1d320 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1d330 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1d340 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
1d370 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
1d380 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
1d390 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
1d3a0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
1d3b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
1d3c0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
1d3d0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
1d3e0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
1d3f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
1d400 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
1d410 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d420 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
1d430 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
1d440 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
1d450 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1d460 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
1d470 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d480 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65  getPage(pBt, iNe
1d490 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
1d4a0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
1d4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d4d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1d4e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1d4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d510 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
1d520 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1d530 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d550 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1d560 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
1d570 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1d580 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d590 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
1d5a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d5b0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1d5c0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
1d5d0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1d5e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d5f0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1d600 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
1d610 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1d620 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1d630 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
1d640 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
1d650 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
1d660 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
1d670 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
1d680 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1d690 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1d6a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1d6b0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
1d6c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1d6d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d6e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d6f0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
1d700 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1d710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d720 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1d730 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d740 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1d750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d760 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d770 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1d780 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
1d790 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d7b0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1d7c0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1d7d0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
1d7e0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
1d7f0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
1d800 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
1d810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d820 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
1d830 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
1d840 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  unk */.        i
1d850 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  nt closest;.    
1d860 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
1d870 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
1d880 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
1d890 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
1d8a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d8b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1d8c0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1d8d0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1d8e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1d8f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1d900 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1d910 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
1d920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1d930 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20  nt i, dist;.    
1d940 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1d950 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  0;.          dis
1d960 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  t = get4byte(&aD
1d970 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
1d980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d990 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
1d9a0 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  -dist;.         
1d9b0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
1d9c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1d9d0 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79   int d2 = get4by
1d9e0 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
1d9f0 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1da00 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30          if( d2<0
1da10 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20   ) d2 = -d2;.   
1da20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1da30 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
1da40 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1da50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
1da60 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
1da70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1da80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1da90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1daa0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1dab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
1dac0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1dad0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
1dae0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  *4]);.        if
1daf0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
1db00 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
1db10 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  {.          *pPg
1db20 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
1db30 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
1db40 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  >sqlite3PagerPag
1db50 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1db60 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
1db70 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20     /* Free page 
1db80 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1db90 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  he file */.     
1dba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1dbb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1dbc0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
1dbd0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
1dbe0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
1dbf0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
1dc00 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
1dc20 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
1dc30 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
1dc40 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
1dc50 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
1dc60 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
1dc70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1dc80 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
1dc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1dca0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
1dcb0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
1dcc0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
1dcd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dce0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
1dcf0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1dd00 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
1dd10 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1dd20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  ppPage, 1);.    
1dd30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1dd40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dd50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1dd60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1dd70 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1dd80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1dd90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dda0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ddb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1ddc0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1ddd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dde0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1ddf0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1de00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1de10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1de20 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1de30 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1de40 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1de50 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1de60 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1de70 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1de80 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1de90 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1dea0 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1deb0 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1dec0 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e  ile */.    *pPgn
1ded0 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
1dee0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1def0 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66  Pager) + 1;..#if
1df00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1df10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1df20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1df30 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
1df40 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
1df50 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
1df60 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
1df70 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
1df80 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
1df90 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
1dfa0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
1dfb0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
1dfc0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
1dfd0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
1dfe0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
1dff0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
1e000 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
1e010 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
1e020 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
1e030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e040 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e050 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1e060 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
1e070 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
1e080 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
1e090 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1e0a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e0b0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
1e0c0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 23  Pgno)++;.    }.#
1e0d0 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72  endif..    asser
1e0e0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1e0f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e100 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
1e110 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
1e120 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
1e130 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1e140 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1e150 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e160 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1e170 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e190 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e1a0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1e1b0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
1e1c0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1e1d0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
1e1e0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
1e1f0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1e200 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1e210 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
1e220 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
1e230 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1e240 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
1e250 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1e260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e270 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67  ./*.** Add a pag
1e280 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e290 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72  e file to the fr
1e2a0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71  eelist..**.** sq
1e2b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e2c0 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20  ) is NOT called 
1e2d0 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
1e2e0 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
1e2f0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1e300 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1e310 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1e320 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1e330 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1e340 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b  ;.  int rc, n, k
1e350 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20  ;..  /* Prepare 
1e360 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65  the page for fre
1e370 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  eing */.  assert
1e380 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
1e390 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  );.  pPage->isIn
1e3a0 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  it = 0;.  releas
1e3b0 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61  ePage(pPage->pPa
1e3c0 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  rent);.  pPage->
1e3d0 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  pParent = 0;..  
1e3e0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1e3f0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
1e400 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
1e410 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e420 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1e430 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1e440 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e450 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
1e460 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e470 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
1e480 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e490 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
1e4a0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
1e4b0 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
1e4c0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1e4d0 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
1e4e0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
1e4f0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
1e500 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
1e510 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
1e520 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
1e530 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
1e540 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e550 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1e560 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1e570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
1e580 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
1e590 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
1e5a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
1e5b0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1e5c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e5d0 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  UUM.  /* If the 
1e5e0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
1e5f0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
1e600 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
1e610 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1e620 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
1e630 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
1e640 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
1e650 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1e660 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1e670 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
1e680 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  Page->pgno, PTRM
1e690 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
1e6a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1e6b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1e6c0 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20  dif..  if( n==0 
1e6d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
1e6e0 73 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  s the first free
1e6f0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20   page */.    rc 
1e700 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e710 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
1e720 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1e730 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e740 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
1e750 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20  Data, 0, 8);.   
1e760 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1e770 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50  1->aData[32], pP
1e780 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1e790 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
1e7a0 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20  E: %d first\n", 
1e7b0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
1e7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1e7d0 74 68 65 72 20 66 72 65 65 20 70 61 67 65 73 20  ther free pages 
1e7e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 20  already exist.  
1e7f0 52 65 74 72 69 76 65 20 74 68 65 20 66 69 72 73  Retrive the firs
1e800 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
1e810 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c   ** of the freel
1e820 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74  ist and find out
1e830 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73   how many leaves
1e840 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20   it has. */.    
1e850 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b  MemPage *pTrunk;
1e860 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
1e870 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
1e880 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e890 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  2]), &pTrunk, 0)
1e8a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e8b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20  eturn rc;.    k 
1e8c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1e8d0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1e8e0 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75     if( k>=pBt->u
1e8f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
1e900 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1e910 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20  trunk is full.  
1e920 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62 65  Turn the page be
1e930 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61  ing freed into a
1e940 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72   new.      ** tr
1e950 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f  unk page with no
1e960 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20   leaves. */.    
1e970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e980 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
1e990 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e9a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e9b0 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  rc;.      put4by
1e9c0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1e9d0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a   pTrunk->pgno);.
1e9e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e9f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
1ea00 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1ea10 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1ea20 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
1ea30 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43  gno);.      TRAC
1ea40 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1ea50 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
1ea60 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
1ea70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ea80 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72  pPage->pgno, pTr
1ea90 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
1eaa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1eab0 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66   Add the newly f
1eac0 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c  reed page as a l
1ead0 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65  eaf on the curre
1eae0 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  nt trunk */.    
1eaf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1eb00 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1eb10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1eb20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1eb30 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62   rc;.      put4b
1eb40 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1eb50 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20  ta[4], k+1);.   
1eb60 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1eb70 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
1eb80 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1eb90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1eba0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1ebb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ebc0 44 6f 6e 74 57 72 69 74 65 28 70 42 74 2d 3e 70  DontWrite(pBt->p
1ebd0 50 61 67 65 72 2c 20 70 50 61 67 65 2d 3e 70 67  Pager, pPage->pg
1ebe0 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  no);.#endif.    
1ebf0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1ec00 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
1ec10 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
1ec20 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
1ec30 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
1ec40 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
1ec50 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
1ec60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ec70 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
1ec80 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1ec90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1eca0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
1ecb0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
1ecc0 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
1ecd0 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
1ece0 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
1ecf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ed00 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
1ed10 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
1ed20 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
1ed30 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
1ed40 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
1ed50 67 65 53 69 7a 65 3b 0a 0a 20 20 70 61 72 73 65  geSize;..  parse
1ed60 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
1ed70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1ed80 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
1ed90 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
1eda0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
1edb0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
1edc0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
1edd0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
1ede0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
1edf0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
1ee00 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
1ee10 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c  erflow]);.  ovfl
1ee20 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
1ee30 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
1ee40 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
1ee50 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
1ee60 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
1ee70 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
1ee80 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
1ee90 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
1eea0 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
1eeb0 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
1eec0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
1eed0 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  vfl;.    if( ovf
1eee0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c  lPgno==0 || ovfl
1eef0 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  Pgno>sqlite3Page
1ef00 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1ef10 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1ef20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1ef30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ef40 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50   }.    rc = getP
1ef50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
1ef60 6f 2c 20 26 70 4f 76 66 6c 2c 20 30 29 3b 0a 20  o, &pOvfl, 0);. 
1ef70 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1ef80 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
1ef90 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 6f 76  Ovfl ){.      ov
1efa0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
1efb0 65 28 70 4f 76 66 6c 2d 3e 61 44 61 74 61 29 3b  e(pOvfl->aData);
1efc0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1efd0 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
1efe0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1eff0 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
1f000 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f010 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f030 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f040 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
1f050 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
1f060 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
1f070 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
1f080 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1f090 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
1f0a0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
1f0b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
1f0c0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
1f0d0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
1f0e0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
1f0f0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1f100 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
1f110 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1f120 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
1f130 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
1f140 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
1f150 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
1f160 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
1f170 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
1f180 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
1f190 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
1f1a0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
1f1b0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
1f1c0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
1f1d0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
1f1e0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
1f1f0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
1f200 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
1f210 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
1f220 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
1f230 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
1f240 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
1f250 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
1f260 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1f270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1f280 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1f290 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
1f2a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
1f2b0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
1f2c0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
1f2d0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
1f2e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1f2f0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
1f300 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
1f310 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
1f320 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
1f330 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
1f340 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f360 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
1f370 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1f380 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
1f390 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
1f3a0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
1f3b0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
1f3c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
1f3d0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
1f3e0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
1f3f0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1f400 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
1f410 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
1f420 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
1f430 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1f440 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
1f450 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
1f460 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
1f470 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46  fo info;..  /* F
1f480 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
1f490 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
1f4a0 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
1f4b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
1f4c0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
1f4d0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
1f4e0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
1f4f0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
1f500 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
1f510 5d 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c  ], nData);.  }el
1f520 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
1f530 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
1f540 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
1f550 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
1f560 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
1f570 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  parseCellPtr(pPa
1f580 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1f590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
1f5a0 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
1f5b0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1f5c0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
1f5d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
1f5e0 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 20 29  o.nData==nData )
1f5f0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
1f600 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
1f610 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
1f620 61 74 61 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ata;.  if( pPage
1f630 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1f640 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
1f650 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
1f660 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
1f670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
1f680 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
1f690 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
1f6a0 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
1f6b0 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
1f6c0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
1f6d0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
1f6e0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
1f6f0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
1f700 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
1f710 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1f720 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
1f730 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
1f740 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
1f750 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
1f760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f770 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
1f780 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
1f790 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
1f7a0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1f7b0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
1f7c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
1f7d0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1f7e0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
1f7f0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
1f800 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
1f810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f820 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1f830 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
1f840 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
1f850 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
1f860 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
1f870 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
1f880 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
1f890 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
1f8a0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
1f8b0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
1f8c0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
1f8d0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
1f8e0 54 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  The entry for th
1f8f0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1f900 20 70 61 67 65 20 77 69 6c 6c 20 62 65 0a 20 20   page will be.  
1f910 20 20 20 20 2a 2a 20 61 64 64 65 64 20 6c 61 74      ** added lat
1f920 65 72 2c 20 62 79 20 74 68 65 20 69 6e 73 65 72  er, by the inser
1f930 74 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 2e  tCell() routine.
1f940 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f950 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f960 75 75 6d 20 26 26 20 70 67 6e 6f 50 74 72 6d 61  uum && pgnoPtrma
1f970 70 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  p!=0 && rc==SQLI
1f980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f990 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
1f9a0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  pBt, pgnoOvfl, P
1f9b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1f9c0 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20   pgnoPtrmap);.  
1f9d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1f9e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f9f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1fa00 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
1fa10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fa20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1fa30 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
1fa40 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
1fa50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
1fa60 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
1fa70 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
1fa80 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
1fa90 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
1faa0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1fab0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
1fac0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
1fad0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
1fae0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
1faf0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1fb00 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
1fb10 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
1fb20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
1fb30 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
1fb40 74 3b 0a 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  t;.    if( n>nSr
1fb50 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
1fb60 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
1fb70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
1fb80 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
1fb90 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
1fba0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
1fbb0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
1fbc0 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
1fbd0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
1fbe0 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
1fbf0 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
1fc00 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
1fc10 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
1fc20 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
1fc30 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
1fc40 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
1fc50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fc60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1fc70 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74   MemPage.pParent
1fc80 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20   pointer on the 
1fc90 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65  page whose numbe
1fca0 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e  r is.** given in
1fcb0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1fcc0 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d  ment so that Mem
1fcd0 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c  Page.pParent hol
1fce0 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65  ds the.** pointe
1fcf0 72 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61  r in the third a
1fd00 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1fd10 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50  ic int reparentP
1fd20 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  age(BtShared *pB
1fd30 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65  t, Pgno pgno, Me
1fd40 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e  mPage *pNewParen
1fd50 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d  t, int idx){.  M
1fd60 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20  emPage *pThis;. 
1fd70 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
1fd80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
1fd90 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20  wParent!=0 );.  
1fda0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
1fdb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fdc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1fdd0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44  Pager!=0 );.  pD
1fde0 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
1fdf0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
1fe00 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1fe10 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
1fe20 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d      pThis = (Mem
1fe30 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
1fe40 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
1fe50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  age);.    if( pT
1fe60 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  his->isInit ){. 
1fe70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68       assert( pTh
1fe80 69 73 2d 3e 61 44 61 74 61 3d 3d 28 73 71 6c 69  is->aData==(sqli
1fe90 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
1fea0 70 44 62 50 61 67 65 29 29 20 29 3b 0a 20 20 20  pDbPage)) );.   
1feb0 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
1fec0 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
1fed0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
1fee0 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
1fef0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
1ff00 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
1ff10 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
1ff20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
1ff30 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
1ff40 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
1ff50 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
1ff60 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
1ff70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ff80 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
1ff90 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
1ffa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ffb0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
1ffc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ffd0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ffe0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1fff0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65  Vacuum ){.    re
20000 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
20010 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  Bt, pgno, PTRMAP
20020 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65  _BTREE, pNewPare
20030 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23  nt->pgno);.  }.#
20040 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
20050 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
20060 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
20070 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
20080 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
20090 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e  of pPage to poin
200a0 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61  t back.** to pPa
200b0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ge..**.** In oth
200c0 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76  er words, for ev
200d0 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ery child of pPa
200e0 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72  ge, invoke repar
200f0 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20  entPage().** to 
20100 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65  make sure that e
20110 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20  ach child knows 
20120 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74  that pPage is it
20130 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  s parent..**.** 
20140 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
20150 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79  s called after y
20160 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20  ou memcpy() one 
20170 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f  page into.** ano
20180 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
20190 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c  int reparentChil
201a0 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  dPages(MemPage *
201b0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
201c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
201d0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
201e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
201f0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
20200 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e  e->leaf ) return
20210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
20220 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
20230 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
20240 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
20250 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
20260 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
20270 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
20280 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67  rc = reparentPag
20290 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
202a0 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69  pCell), pPage, i
202b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
202c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
202d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
202e0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
202f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
20300 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
20310 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
20320 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
20330 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20  >hdrOffset+8]), 
20340 0a 20 20 20 20 20 20 20 70 50 61 67 65 2c 20 69  .       pPage, i
20350 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64  );.    pPage->id
20360 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a  xShift = 0;.  }.
20370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20380 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
20390 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
203a0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
203b0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
203c0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
203d0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
203e0 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
203f0 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
20400 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
20410 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
20420 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
20430 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
20440 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
20450 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
20460 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
20470 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
20480 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
20490 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
204a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
204b0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
204c0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
204d0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
204e0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
204f0 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
20500 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
20510 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
20520 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
20530 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
20540 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
20550 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
20560 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
20570 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
20580 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
20590 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
205a0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
205b0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
205c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
205d0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
205e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
205f0 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
20600 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
20610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20620 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
20630 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
20640 67 65 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ge) );.  data = 
20650 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
20660 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
20670 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
20680 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
20690 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
206a0 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26  assert( pc>10 &&
206b0 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70   pc+sz<=pPage->p
206c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
206d0 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50  ;.  freeSpace(pP
206e0 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
206f0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
20700 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
20710 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
20720 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
20730 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
20740 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
20750 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
20760 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
20770 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
20780 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
20790 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
207a0 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 2;.  pPage->id
207b0 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  xShift = 1;.}../
207c0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
207d0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
207e0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
207f0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
20800 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
20810 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
20820 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
20830 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
20840 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
20850 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
20860 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
20870 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
20880 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
20890 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
208a0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
208b0 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
208c0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
208d0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
208e0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
208f0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
20900 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
20910 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
20920 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
20930 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
20940 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
20950 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
20960 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
20970 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
20980 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
20990 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
209a0 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
209b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
209c0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
209d0 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
209e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
209f0 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
20a00 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
20a10 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
20a20 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
20a30 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
20a40 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
20a50 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
20a60 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
20a70 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
20a80 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
20a90 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
20aa0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
20ab0 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
20ac0 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
20ad0 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
20ae0 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
20af0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
20b00 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
20b10 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
20b20 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
20b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b40 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
20b50 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
20b60 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
20b70 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
20b80 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
20b90 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
20ba0 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
20bb0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
20bc0 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
20bd0 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
20be0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
20bf0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
20c00 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
20c10 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20  d */.  u8 nSkip 
20c20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
20c30 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72  ot write the fir
20c40 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
20c50 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  f the cell */.){
20c60 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
20c70 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
20c80 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
20c90 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
20ca0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
20cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20cc0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
20cd0 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
20ce0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
20cf0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
20d00 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
20d10 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
20d20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20d30 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
20d40 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
20d50 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
20d60 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
20d70 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
20d80 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
20d90 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
20da0 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
20db0 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
20dc0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
20dd0 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
20de0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
20df0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
20e00 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
20e10 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
20e20 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
20e30 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
20e40 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
20e50 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
20e60 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
20e70 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
20e80 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
20e90 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
20ea0 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
20eb0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
20ec0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
20ed0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
20ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
20ef0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
20f00 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
20f10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
20f20 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
20f30 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
20f40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
20f50 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
20f60 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
20f70 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
20f80 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
20f90 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
20fa0 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
20fb0 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
20fc0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
20fd0 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
20fe0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
20ff0 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28  ssert( j<sizeof(
21000 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
21010 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
21020 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  l[0]) );.    pPa
21030 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
21040 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
21050 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
21060 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61  idx = i;.    pPa
21070 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
21080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61   }else{.    data
21090 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
210a0 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
210b0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
210c0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
210d0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
210e0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
210f0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
21100 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
21110 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
21120 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20  e->nCell + 2;.  
21130 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
21140 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66  et + 2*i;.    if
21150 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a  ( end > top - sz
21160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
21170 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
21180 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
21190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
211a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
211b0 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62       top = get2b
211c0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
211d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
211e0 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70   end + sz <= top
211f0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
21200 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  x = allocateSpac
21210 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20  e(pPage, sz);.  
21220 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20    assert( idx>0 
21230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
21240 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26  nd <= get2byte(&
21250 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
21260 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
21270 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
21280 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
21290 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
212a0 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
212b0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
212c0 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
212d0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
212e0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
212f0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
21300 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
21310 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
21320 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
21330 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
21340 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
21350 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
21360 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
21370 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  l);.    pPage->i
21380 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66  dxShift = 1;.#if
21390 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
213a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
213b0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
213c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
213d0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
213e0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
213f0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
21400 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
21410 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
21420 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
21430 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
21440 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
21450 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
21460 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
21470 6e 66 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65  nfo;.      parse
21480 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
21490 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
214a0 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
214b0 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
214c0 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
214d0 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
214e0 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
214f0 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
21500 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
21510 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
21520 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
21530 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
21540 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
21550 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
21560 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  );.        int r
21570 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50  c = ptrmapPut(pP
21580 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76  age->pBt, pgnoOv
21590 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
215a0 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
215b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
215c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
215d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
215e0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
215f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
21600 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21610 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
21620 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
21630 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
21640 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
21650 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
21660 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
21670 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
21680 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
21690 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
216a0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
216b0 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
216c0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
216d0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
216e0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
216f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
21700 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
21710 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
21720 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
21730 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
21740 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74   bodies */.  int
21750 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
21760 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
21770 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
21780 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
21790 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
217a0 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a  /.  int totalSiz
217b0 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  e;    /* Total s
217c0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
217d0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
217e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
217f0 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
21800 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72  */.  int cellptr
21810 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
21820 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
21830 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
21840 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
21850 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
21860 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
21870 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
21880 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
21890 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  e page */..  ass
218a0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
218b0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f  rflow==0 );.  to
218c0 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66  talSize = 0;.  f
218d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
218e0 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c   i++){.    total
218f0 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  Size += aSize[i]
21900 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21910 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c  totalSize+2*nCel
21920 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  l<=pPage->nFree 
21930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21940 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
21950 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
21960 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
21970 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
21980 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
21990 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
219a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
219b0 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
219c0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
219d0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
219e0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
219f0 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
21a00 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
21a10 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
21a20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
21a30 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
21a40 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
21a50 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
21a60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
21a70 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
21a80 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
21a90 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
21aa0 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
21ab0 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
21ac0 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
21ad0 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
21ae0 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
21af0 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
21b00 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
21b10 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
21b20 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
21b30 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
21b40 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
21b50 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a   = nCell;.}../*.
21b60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21b70 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
21b80 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
21b90 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
21ba0 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
21bb0 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
21bc0 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
21bd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
21be0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
21bf0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
21c00 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
21c10 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
21c20 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
21c30 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
21c40 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
21c50 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
21c60 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
21c70 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
21c80 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
21c90 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
21ca0 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
21cb0 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
21cc0 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
21cd0 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
21ce0 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
21cf0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
21d00 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
21d10 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
21d20 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
21d30 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
21d40 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
21d50 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
21d60 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
21d70 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
21d80 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
21d90 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
21da0 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
21db0 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
21dc0 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
21dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21de0 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
21df0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
21e00 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
21e10 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
21e20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
21e30 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
21e40 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
21e50 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
21e60 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
21e70 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
21e80 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  age*, int);..#if
21e90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21ea0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
21eb0 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
21ec0 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
21ed0 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
21ee0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
21ef0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
21f00 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
21f10 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
21f20 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
21f30 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
21f40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
21f50 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
21f60 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
21f70 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
21f80 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
21f90 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
21fa0 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
21fb0 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
21fc0 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
21fd0 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
21fe0 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
21ff0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
22000 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
22010 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
22020 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
22030 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
22040 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
22050 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
22060 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
22070 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
22080 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
22090 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
220a0 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
220b0 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
220c0 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
220d0 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
220e0 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
220f0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
22100 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
22110 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
22120 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
22130 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
22140 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
22150 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
22160 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
22170 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
22180 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
22190 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
221a0 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
221b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
221c0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
221d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d  emPage *pPage, M
221e0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29  emPage *pParent)
221f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
22200 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50  mPage *pNew;.  P
22210 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75  gno pgnoNew;.  u
22220 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  8 *pCell;.  int 
22230 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e  szCell;.  CellIn
22240 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61  fo info;.  BtSha
22250 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
22260 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72  ->pBt;.  int par
22270 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74  entIdx = pParent
22280 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50  ->nCell;   /* pP
22290 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65  arent new divide
222a0 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  r cell index */.
222b0 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65    int parentSize
222c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
222d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
222e0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
222f0 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65  */.  u8 parentCe
22300 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20  ll[64];         
22310 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
22320 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69  for the new divi
22330 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f  der cell */..  /
22340 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
22350 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68   page. Insert th
22360 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
22370 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20  from pPage.  ** 
22380 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  into it. Then re
22390 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  move the overflo
223a0 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
223b0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  e..  */.  rc = a
223c0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
223d0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
223e0 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  noNew, 0, 0);.  
223f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22400 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
22410 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20  rc;.  }.  pCell 
22420 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
22430 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c  ].pCell;.  szCel
22440 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
22450 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
22460 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
22470 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29  pPage->aData[0])
22480 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ;.  assemblePage
22490 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
224a0 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50  , &szCell);.  pP
224b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
224c0 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   0;..  /* Set th
224d0 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
224e0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
224f0 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e  page to pParent.
22500 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72   */.  pNew->pPar
22510 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
22520 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
22530 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
22540 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20  e);..  /* pPage 
22550 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
22560 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
22570 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
22580 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61  this.  ** so tha
22590 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
225a0 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67  d is the new pag
225b0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  e allocated abov
225c0 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65  e and.  ** pPage
225d0 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
225e0 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
225f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
22600 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
22610 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
22620 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
22630 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
22640 6c 2d 31 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l-1), &info);.  
22650 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
22660 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
22670 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
22680 79 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  y, 0, 0, &parent
22690 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
226a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
226b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
226c0 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e  .  assert( paren
226d0 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63  tSize<64 );.  rc
226e0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
226f0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
22700 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
22710 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
22720 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
22740 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74  rn rc;.  }.  put
22750 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
22760 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
22770 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
22780 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62  ->pgno);.  put4b
22790 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
227a0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
227b0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
227c0 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ew);..#ifndef SQ
227d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
227e0 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69  CUUM.  /* If thi
227f0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
22800 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
22810 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
22820 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65   map.  ** with e
22830 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
22840 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
22850 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
22860 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  e .  ** cell on 
22870 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
22880 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
22890 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
228a0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
228b0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
228c0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
228d0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
228e0 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  nt->pgno);.    i
228f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22910 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
22920 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
22930 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  l(pNew, 0);.    
22940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22950 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
22960 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
22970 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c  #endif..  /* Rel
22980 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
22990 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
229a0 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74  ge and balance t
229b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a  he parent page,.
229c0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
229d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
229e0 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74  serted caused it
229f0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
22a00 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ull..  */.  rele
22a10 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
22a20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28   return balance(
22a30 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23  pParent, 0);.}.#
22a40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22a50 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
22a60 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
22a70 49 53 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  ISAUTOVACUUM mac
22a80 72 6f 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ro is used withi
22a90 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  n balance_nonroo
22aa0 74 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  t() to determine
22ab0 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
22ac0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
22ad0 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e 6f 74 2e  o-vacuum or not.
22ae0 20 42 65 63 61 75 73 65 20 69 74 20 69 73 20 75   Because it is u
22af0 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e  sed.** within an
22b00 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
22b10 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   is an argument 
22b20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61 63 72 6f  to another macro
22b30 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d 61 6c 6c   .** (sqliteMall
22b40 6f 63 52 61 77 29 2c 20 69 74 20 69 73 20 6e 6f  ocRaw), it is no
22b50 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
22b60 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f  e conditional co
22b70 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f  mpilation..** So
22b80 2c 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  , this macro is 
22b90 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61 64 2e  defined instead.
22ba0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22bb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22bc0 55 4d 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54  UM.#define ISAUT
22bd0 4f 56 41 43 55 55 4d 20 28 70 42 74 2d 3e 61 75  OVACUUM (pBt->au
22be0 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c 73 65 0a  toVacuum).#else.
22bf0 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41  #define ISAUTOVA
22c00 43 55 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  CUUM 0.#endif../
22c10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22c20 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
22c30 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
22c40 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
22c50 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
22c60 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
22c70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
22c80 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
22c90 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
22ca0 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
22cb0 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
22cc0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
22cd0 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
22ce0 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
22cf0 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
22d00 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
22d10 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
22d20 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
22d30 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
22d40 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
22d50 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
22d60 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
22d70 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
22d80 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
22d90 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
22da0 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
22db0 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
22dc0 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
22dd0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
22de0 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
22df0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
22e00 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
22e10 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
22e20 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
22e30 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
22e40 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
22e50 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
22e60 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
22e70 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
22e80 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
22e90 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
22ea0 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
22eb0 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
22ec0 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
22ed0 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
22ee0 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
22ef0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
22f00 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
22f10 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
22f20 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
22f30 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
22f40 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
22f50 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
22f60 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
22f70 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
22f80 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
22f90 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
22fa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
22fb0 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
22fc0 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
22fd0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
22fe0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
22ff0 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
23000 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
23010 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
23020 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
23030 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
23040 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
23050 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
23060 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
23070 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
23080 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
23090 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
230a0 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
230b0 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
230c0 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
230d0 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
230e0 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
230f0 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
23100 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
23110 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
23120 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
23130 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
23140 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
23150 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
23160 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
23170 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
23180 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
23190 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
231a0 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
231b0 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
231c0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
231d0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
231e0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
231f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
23200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
23210 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d  ance_nonroot(Mem
23220 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
23230 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
23240 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23250 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  The parent of pP
23260 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
23270 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
23280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23290 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
232a0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
232b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
232c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
232d0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
232e0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
232f0 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
23300 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
23310 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
23320 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
23330 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
23360 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
23370 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
233a0 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
233b0 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20  .  int nDiv;    
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
233e0 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f  ls in apDiv[] */
233f0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
23420 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23440 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70     /* Index of p
23450 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d  Page in pParent-
23460 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
23470 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
23480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23490 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
234a0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
234b0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  l[] */.  int rc;
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
234e0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
234f0 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t leafCorrection
23500 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
23510 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
23520 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
23530 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
23560 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
23570 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
23580 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
23590 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
235a0 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
235b0 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
235c0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
235d0 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
235e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
235f0 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
23600 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
23610 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
23620 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
23630 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
23640 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
23650 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20  .  int iSpace = 
23660 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23670 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
23680 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d  byte of aSpace[]
23690 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
236a0 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
236b0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
236c0 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
236d0 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
236e0 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  oOld[NB];       
236f0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
23700 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
23710 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  ge in apOld[] */
23720 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
23730 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
23740 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
23750 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
23760 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
23770 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
23780 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
23790 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
237a0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
237b0 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ing */.  Pgno pg
237c0 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  noNew[NB+2];    
237d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
237e0 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
237f0 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  age in apNew[] *
23800 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
23810 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
23820 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
23830 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
23840 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
23850 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
23860 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
23870 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
23880 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
23890 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238b0 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
238c0 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
238d0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
238e0 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
238f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23900 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
23910 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
23920 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
23930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
23940 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
23950 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
23960 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b   */.  u8 *aCopy[
23970 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
23980 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23990 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
239a0 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
239b0 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20 20   *aSpace;       
239c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
239d0 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69  ace to hold copi
239e0 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
239f0 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ells */.#ifndef 
23a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23a10 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72  VACUUM.  u8 *aFr
23a20 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  om = 0;.#endif..
23a30 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20    /* .  ** Find 
23a40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
23a50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23a60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
23a70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23a80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
23a90 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
23aa0 65 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  e) );.  pBt = pP
23ab0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72  age->pBt;.  pPar
23ac0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
23ad0 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20  rent;.  assert( 
23ae0 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28  pParent );.  if(
23af0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
23b00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23b10 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
23b20 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65  Page)) ){.    re
23b30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54  turn rc;.  }.  T
23b40 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
23b50 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
23b60 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
23b70 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
23b80 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66  nt->pgno));..#if
23b90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23ba0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
23bb0 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61  /*.  ** A specia
23bc0 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65  l case:  If a ne
23bd0 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74  w entry has just
23be0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
23bf0 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65  nto a.  ** table
23c00 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74 72   (that is, a btr
23c10 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72 20  ee with integer 
23c20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74  keys and all dat
23c30 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73 29  a at the leaves)
23c40 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65  .  ** and the ne
23c50 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 72  w entry is the r
23c60 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
23c70 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74 20  in the tree (it 
23c80 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72  has the.  ** lar
23c90 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75  gest key) then u
23ca0 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 62  se the special b
23cb0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72  alance_quick() r
23cc0 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20  outine for.  ** 
23cd0 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61  balancing.  bala
23ce0 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d  nce_quick() is m
23cf0 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20 72  uch faster and r
23d00 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68  esults in a tigh
23d10 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67  ter.  ** packing
23d20 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
23d30 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a  common case..  *
23d40 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  /.  if( pPage->l
23d50 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50 61  eaf &&.      pPa
23d60 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20  ge->intKey &&.  
23d70 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44      pPage->leafD
23d80 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50 61  ata &&.      pPa
23d90 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
23da0 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
23db0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
23dc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20  Page->nCell &&. 
23dd0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72       pPage->pPar
23de0 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a  ent->pgno!=1 &&.
23df0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
23e00 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
23e10 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
23e20 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67  t+8])==pPage->pg
23e30 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  no.  ){.    /*. 
23e40 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63     ** TODO: Chec
23e50 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  k the siblings t
23e60 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50  o the left of pP
23e70 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74  age. It may be t
23e80 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20  hat.    ** they 
23e90 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64  are not full and
23ea0 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20   no new page is 
23eb0 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
23ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61  .    return bala
23ed0 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c  nce_quick(pPage,
23ee0 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23   pParent);.  }.#
23ef0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
23f00 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69   Find the cell i
23f10 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
23f20 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69  e whose left chi
23f30 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20  ld points back. 
23f40 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54   ** to pPage.  T
23f50 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c  he "idx" variabl
23f60 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  e is the index o
23f70 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66  f that cell.  If
23f80 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74   pPage.  ** is t
23f90 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69  he rightmost chi
23fa0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68  ld of pParent th
23fb0 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50  en set idx to pP
23fc0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20  arent->nCell .  
23fd0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
23fe0 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20  ->idxShift ){.  
23ff0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
24000 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
24010 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
24020 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61   pgno==sqlite3Pa
24030 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
24040 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
24050 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20  .    for(idx=0; 
24060 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
24070 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  ll; idx++){.    
24080 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66    if( get4byte(f
24090 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
240a0 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a   idx))==pgno ){.
240b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
240c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
240d0 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
240e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  rent->nCell.    
240f0 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34           || get4
24100 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
24110 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
24120 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e  rOffset+8])==pgn
24130 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o );.  }else{.  
24140 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69    idx = pPage->i
24150 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20  dxParent;.  }.. 
24160 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c   /*.  ** Initial
24170 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ize variables so
24180 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
24190 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20   safe to jump.  
241a0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62  ** directly to b
241b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61  alance_cleanup a
241c0 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t any moment..  
241d0 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77  */.  nOld = nNew
241e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
241f0 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
24200 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  >pDbPage);..  /*
24210 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69  .  ** Find sibli
24220 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67  ng pages to pPag
24230 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20  e and the cells 
24240 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20  in pParent that 
24250 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20  divide.  ** the 
24260 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74  siblings.  An at
24270 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
24280 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
24290 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a  s on either.  **
242a0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
242b0 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
242c0 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
242d0 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
242e0 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74   if.  ** pPage t
242f0 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
24300 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
24310 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
24320 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20  e.  If pParent. 
24330 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
24340 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
24350 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
24360 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
24370 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69  ken..  */.  nxDi
24380 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20  v = idx - NN;.  
24390 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e  if( nxDiv + NB >
243a0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
243b0 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70  ){.    nxDiv = p
243c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20  Parent->nCell - 
243d0 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66  NB + 1;.  }.  if
243e0 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20  ( nxDiv<0 ){.   
243f0 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a   nxDiv = 0;.  }.
24400 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f    nDiv = 0;.  fo
24410 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20  r(i=0, k=nxDiv; 
24420 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  i<NB; i++, k++){
24430 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65  .    if( k<pPare
24440 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
24450 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
24460 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
24470 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b  k);.      nDiv++
24480 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24490 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29  !pParent->leaf )
244a0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  ;.      pgnoOld[
244b0 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  i] = get4byte(ap
244c0 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c  Div[i]);.    }el
244d0 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e  se if( k==pParen
244e0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
244f0 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
24500 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
24510 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
24520 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
24530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24540 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
24550 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
24560 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f  tPage(pBt, pgnoO
24570 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d  ld[i], &apOld[i]
24580 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , pParent);.    
24590 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
245a0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
245b0 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78     apOld[i]->idx
245c0 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20  Parent = k;.    
245d0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20  apCopy[i] = 0;. 
245e0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f     assert( i==nO
245f0 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b  ld );.    nOld++
24600 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  ;.    nMaxCells 
24610 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
24620 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
24630 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20  Overflow;.  }.. 
24640 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
24650 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
24660 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   2 in order to p
24670 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
24680 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
24690 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
246a0 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e  nMaxCells + 1)&~
246b0 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  1;..  /*.  ** Al
246c0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
246d0 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
246e0 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  es.  */.  apCell
246f0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
24700 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d 61 78  aw( .       nMax
24710 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
24720 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
24730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
24740 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
24750 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
24760 28 69 6e 74 29 20 20 20 20 20 20 20 20 20 20 20  (int)           
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
24790 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f    + ROUND8(sizeo
247a0 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20 20  f(MemPage))*NB  
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a      /* aCopy */.
247d0 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
247e0 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20 20  Size*(5+NB)     
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
24810 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55   */.     + (ISAU
24820 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43  TOVACUUM ? nMaxC
24830 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20 20  ells : 0)       
24840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46             /* aF
24850 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  rom */.  );.  if
24860 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
24870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
24880 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
24890 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
248a0 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
248b0 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  int*)&apCell[nMa
248c0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79  xCells];.  aCopy
248d0 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  [0] = (u8*)&szCe
248e0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
248f0 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
24900 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [0] - (u8*)apCel
24910 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
24920 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
24930 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
24940 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69  for(i=1; i<NB; i
24950 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69  ++){.    aCopy[i
24960 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b  ] = &aCopy[i-1][
24970 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f  pBt->pageSize+RO
24980 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
24990 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65  age))];.    asse
249a0 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d  rt( ((aCopy[i] -
249b0 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
249c0 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
249d0 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
249e0 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61  uired */.  }.  a
249f0 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e  Space = &aCopy[N
24a00 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  B-1][pBt->pageSi
24a10 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
24a20 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61  (MemPage))];.  a
24a30 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65 20  ssert( ((aSpace 
24a40 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
24a50 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
24a60 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
24a70 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65  quired */.#ifnde
24a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24a90 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
24aa0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
24ab0 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
24ac0 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67  Space[5*pBt->pag
24ad0 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64  eSize];.  }.#end
24ae0 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  if.  .  /*.  ** 
24af0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
24b00 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50  he content of pP
24b10 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
24b20 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d  ings into aOld[]
24b30 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20  ..  ** The rest 
24b40 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
24b50 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
24b60 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
24b70 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ather.  ** that 
24b80 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
24b90 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
24ba0 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
24bb0 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20   be in the.  ** 
24bc0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
24bd0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20   overwritten..  
24be0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
24bf0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
24c00 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43  MemPage *p = apC
24c10 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
24c20 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74  e*)&aCopy[i][pBt
24c30 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20  ->pageSize];.   
24c40 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75   p->aData = &((u
24c50 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65  8*)p)[-pBt->page
24c60 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  Size];.    memcp
24c70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  y(p->aData, apOl
24c80 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
24c90 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69 7a  ->pageSize + siz
24ca0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
24cb0 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79     /* The memcpy
24cc0 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65 73  () above changes
24cd0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d   the value of p-
24ce0 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68 61 76  >aData so we hav
24cf0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20  e to.    ** set 
24d00 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  it again. */.   
24d10 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75   p->aData = &((u
24d20 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65  8*)p)[-pBt->page
24d30 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size];.  }..  /*
24d40 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
24d50 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
24d60 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
24d70 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
24d80 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
24d90 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
24da0 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
24db0 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
24dc0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
24dd0 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
24de0 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61  tained form aSpa
24df0 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  ce[] and remove 
24e00 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20  the the divider 
24e10 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  Cells.  ** from 
24e20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  pParent..  **.  
24e30 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  ** If the siblin
24e40 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70  gs are on leaf p
24e50 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ages, then the c
24e60 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66  hild pointers of
24e70 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65   the.  ** divide
24e80 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69  r cells are stri
24e90 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65  pped from the ce
24ea0 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  lls before they 
24eb0 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20  are copied.  ** 
24ec0 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20  into aSpace[].  
24ed0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
24ee0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
24ef0 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
24f00 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
24f10 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
24f20 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
24f30 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
24f40 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
24f50 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
24f60 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
24f70 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
24f80 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
24f90 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
24fa0 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
24fb0 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
24fc0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
24fd0 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
24fe0 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
24ff0 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
25000 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
25010 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
25020 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
25030 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c  ys..  */.  nCell
25040 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72   = 0;.  leafCorr
25050 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e  ection = pPage->
25060 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
25070 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
25080 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e 6c  Data && pPage->l
25090 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  eaf;.  for(i=0; 
250a0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
250b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
250c0 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  = apCopy[i];.   
250d0 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c   int limit = pOl
250e0 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e  d->nCell+pOld->n
250f0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f  Overflow;.    fo
25100 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20  r(j=0; j<limit; 
25110 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  j++){.      asse
25120 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
25130 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43  lls );.      apC
25140 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
25150 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f  dOverflowCell(pO
25160 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a  ld, j);.      sz
25170 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65  Cell[nCell] = ce
25180 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20  llSizePtr(pOld, 
25190 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a  apCell[nCell]);.
251a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
251b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
251c0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
251d0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
251e0 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20      int a;.     
251f0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
25200 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = i;.        for
25210 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f  (a=0; a<pOld->nO
25220 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20  verflow; a++){. 
25230 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c           if( pOl
25240 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c  d->aOvfl[a].pCel
25250 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  l==apCell[nCell]
25260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25270 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
25280 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xFF;.           
25290 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
252a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
252b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
252c0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
252d0 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
252e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  -1 ){.      int 
252f0 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
25300 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
25310 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  i]);.      if( l
25320 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
25330 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c     /* With the L
25340 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50  EAFDATA flag, pP
25350 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64  arent cells hold
25360 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68   only INTKEYs th
25370 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  at.        ** ar
25380 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
25390 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c  keys on the chil
253a0 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65  d pages.  We nee
253b0 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20  d to remove.    
253c0 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64      ** the divid
253d0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50  er cells from pP
253e0 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64  arent, but the d
253f0 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72  ividers cells ar
25400 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  e not.        **
25410 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c   added to apCell
25420 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20  [] because they 
25430 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
25440 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20  f child cells.. 
25450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25460 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
25470 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
25480 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25490 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
254a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
254b0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
254c0 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
254d0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20  l[nCell] = sz;. 
254e0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26         pTemp = &
254f0 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a  aSpace[iSpace];.
25500 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b          iSpace +
25510 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73  = sz;.        as
25520 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42  sert( iSpace<=pB
25530 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b  t->pageSize*5 );
25540 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
25550 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
25560 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70   sz);.        ap
25570 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
25580 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
25590 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  on;.#ifndef SQLI
255a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
255b0 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  UM.        if( p
255c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
255d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f  {.          aFro
255e0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
255f0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
25600 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  f.        dropCe
25610 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
25620 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  v, sz);.        
25630 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
25640 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
25650 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25660 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29   get4byte(pTemp)
25670 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a  ==pgnoOld[i] );.
25680 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c          if( !pOl
25690 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
256a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
256b0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
256c0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
256d0 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
256e0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
256f0 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
25700 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
25710 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
25720 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
25730 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  l */.          m
25740 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
25750 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
25760 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  a[pOld->hdrOffse
25770 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  t+8], 4);.      
25780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25790 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
257a0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
257b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
257c0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
257d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
257e0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
257f0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
25800 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
25810 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
25820 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
25830 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
25840 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
25850 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
25860 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
25870 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
25880 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
25890 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
258a0 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
258b0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
258c0 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
258d0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
258e0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
258f0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
25900 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
25910 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
25920 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
25930 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
25940 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
25950 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
25960 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
25970 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
25980 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
25990 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
259a0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
259b0 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
259c0 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
259d0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
259e0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
259f0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
25a00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
25a10 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
25a20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
25a30 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
25a40 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
25a50 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
25a60 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
25a70 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
25a80 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
25a90 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
25aa0 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
25ab0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
25ac0 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
25ad0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
25ae0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
25af0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
25b00 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
25b10 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
25b20 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
25b30 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
25b40 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
25b50 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
25b60 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
25b70 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
25b80 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
25b90 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
25ba0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
25bb0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
25bc0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
25bd0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
25be0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
25bf0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
25c00 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
25c10 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
25c20 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
25c30 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
25c40 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
25c50 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
25c60 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
25c70 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
25c80 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
25c90 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
25ca0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
25cb0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
25cc0 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
25cd0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
25ce0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
25cf0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
25d00 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
25d10 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
25d20 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
25d30 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
25d40 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
25d50 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
25d60 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
25d70 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
25d80 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
25d90 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
25da0 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
25db0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
25dc0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
25dd0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
25de0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
25df0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
25e00 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
25e10 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
25e20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
25e30 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
25e40 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
25e50 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
25e60 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
25e70 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
25e80 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
25e90 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
25ea0 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
25eb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25ec0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
25ed0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
25ee0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25f00 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
25f10 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
25f20 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
25f30 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
25f40 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
25f50 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
25f60 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
25f70 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
25f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
25f90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
25fa0 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
25fb0 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
25fc0 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
25fd0 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
25fe0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
25ff0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
26000 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
26010 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
26020 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
26030 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
26040 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
26050 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
26060 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
26070 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
26080 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
26090 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
260a0 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
260b0 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
260c0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
260d0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
260e0 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20  or we are the.  
260f0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
26100 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
26110 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
26120 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
26130 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
26140 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
26150 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
26160 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
26170 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
26180 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
26190 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
261a0 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
261b0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ==0) );..  /*.  
261c0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
261d0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
261e0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
261f0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
26200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26210 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65  pgno>1 );.  page
26220 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61  Flags = pPage->a
26230 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
26240 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
26250 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
26260 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
26270 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
26280 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
26290 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  d[i];.      pgno
262a0 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64  New[i] = pgnoOld
262b0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
262c0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
262d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
262e0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
262f0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
26300 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
26310 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
26320 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
26330 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
26340 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
26350 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
26360 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
26370 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
26380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26390 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
263a0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
263b0 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
263c0 20 20 20 7d 0a 20 20 20 20 6e 4e 65 77 2b 2b 3b     }.    nNew++;
263d0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
263e0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
263f0 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
26400 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
26410 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
26420 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
26430 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
26440 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  nOld ){.    rc =
26450 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
26460 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
26470 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26480 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
26490 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
264a0 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
264b0 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
264c0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
264d0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
264e0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
264f0 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
26500 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
26510 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
26520 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
26530 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
26540 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
26550 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
26560 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
26570 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
26580 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
26590 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
265a0 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
265b0 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
265c0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
265d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
265e0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
265f0 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
26600 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
26610 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
26620 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
26630 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
26640 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
26650 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
26660 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
26670 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
26680 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
26690 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
266a0 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
266b0 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
266c0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
266d0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
266e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
266f0 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
26700 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e  int minV = pgnoN
26710 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d  ew[i];.    int m
26720 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
26730 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
26740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
26750 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65  oNew[j]<(unsigne
26760 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
26770 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
26780 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e      minV = pgnoN
26790 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  ew[j];.      }. 
267a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
267b0 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
267c0 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
267d0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
267e0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
267f0 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
26800 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
26810 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e  i] = pgnoNew[min
26820 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
26830 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
26840 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
26850 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20  minI] = t;.     
26860 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
26870 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
26880 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
26890 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e  old: %d %d %d  n
268a0 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
268b0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
268c0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70  %d(%d)\n",.    p
268d0 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20  gnoOld[0], .    
268e0 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c  nOld>=2 ? pgnoOl
268f0 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  d[1] : 0,.    nO
26900 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=3 ? pgnoOld[
26910 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f  2] : 0,.    pgno
26920 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d  New[0], szNew[0]
26930 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
26940 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20  pgnoNew[1] : 0, 
26950 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
26960 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
26970 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d  >=3 ? pgnoNew[2]
26980 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
26990 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
269a0 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f    nNew>=4 ? pgno
269b0 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[3] : 0, nNew
269c0 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
269d0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
269e0 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30  ? pgnoNew[4] : 0
269f0 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
26a00 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f  w[4] : 0));..  /
26a10 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
26a20 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
26a30 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
26a40 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
26a50 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
26a60 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
26a70 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
26a80 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
26a90 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
26aa0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
26ab0 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
26ac0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
26ad0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
26ae0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
26af0 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
26b00 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
26b10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
26b20 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65  ew->pgno==pgnoNe
26b30 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  w[i] );.    asse
26b40 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
26b50 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
26b60 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
26b70 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
26b80 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
26b90 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
26ba0 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
26bb0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
26bc0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
26bd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26be0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26bf0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
26c00 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
26c10 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
26c20 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
26c30 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
26c40 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
26c50 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61  the siblings tha
26c60 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65  t were rearrange
26c70 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a  d. These can be:
26c80 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69   left.    ** chi
26c90 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20  ldren of cells, 
26ca0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
26cb0 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
26cc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
26cd0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f     ** pointed to
26ce0 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a   by cells..    *
26cf0 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  /.    if( pBt->a
26d00 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
26d10 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
26d20 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
26d30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
26d40 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26d50 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
26d60 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
26d70 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
26d80 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
26d90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26da0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
26db0 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
26dc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26de0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
26df0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
26e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26e10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
26e20 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20  #endif..    j = 
26e30 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
26e40 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
26e50 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
26e60 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
26e70 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
26e80 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
26e90 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
26ea0 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
26eb0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
26ec0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
26ed0 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
26ee0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
26ef0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
26f00 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
26f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
26f20 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26f30 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
26f40 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
26f50 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
26f60 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
26f70 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
26f80 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
26f90 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
26fa0 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
26fb0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
26fc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
26fd0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
26fe0 0a 09 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65  ../* If the tree
26ff0 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
27000 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
27010 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
27020 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
27030 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
27040 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
27050 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
27060 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
27070 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
27080 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
27090 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
270a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
270b0 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
270c0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
270d0 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
270e0 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
270f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
27100 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
27110 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
27120 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e   parseCellPtr(pN
27130 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
27140 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
27150 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69  Cell = &aSpace[i
27160 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
27170 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
27180 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
27190 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26  fo.nKey, 0, 0, &
271a0 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70  sz);.        iSp
271b0 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
271c0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
271d0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
271e0 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  *5 );.        pT
271f0 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
27200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
27210 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
27220 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
27230 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  e[iSpace];.     
27240 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b     iSpace += sz;
27250 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27260 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61   iSpace<=pBt->pa
27270 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20  geSize*5 );.    
27280 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69    }.      rc = i
27290 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
272a0 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
272b0 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a   sz, pTemp, 4);.
272c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
272d0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
272e0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
272f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
27300 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
27310 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
27320 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  pNew->pgno);.#if
27330 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27340 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
27350 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
27360 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
27370 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74  atabase, and not
27380 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
27390 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
273a0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
273b0 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20  ter map with an 
273c0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
273d0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
273e0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65    ** that the ce
273f0 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ll just inserted
27400 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61   points to (if a
27410 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
27420 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
27430 6f 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66  oVacuum && !leaf
27440 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
27450 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
27460 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  fl(pParent, nxDi
27470 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
27480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27490 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
274a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
274b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
274c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
274d0 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
274e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
274f0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
27500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
27510 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
27520 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
27530 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
27540 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
27550 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77     memcpy(&apNew
27560 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nNew-1]->aData[
27570 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64  8], &apCopy[nOld
27580 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34  -1]->aData[8], 4
27590 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44  );.  }.  if( nxD
275a0 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
275b0 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
275c0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
275d0 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
275e0 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
275f0 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
27600 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
27610 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
27620 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
27630 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
27640 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
27650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
27660 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
27670 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
27680 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
27690 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
276a0 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
276b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
276c0 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
276d0 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
276e0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
276f0 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
27700 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
27710 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
27720 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20  parent children 
27730 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20  of all cells..  
27740 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
27750 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
27760 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
27770 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d  ldPages(apNew[i]
27780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27790 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
277a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
277b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61  .  }.  rc = repa
277c0 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70  rentChildPages(p
277d0 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
277e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
277f0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27800 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nup;..  /*.  ** 
27810 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  Balance the pare
27820 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74  nt page.  Note t
27830 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
27840 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67  page (pPage) mig
27850 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ht.  ** have bee
27860 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  n added to the f
27870 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69  reelist so it mi
27880 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  ght no longer be
27890 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
278a0 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e  ** But the paren
278b0 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61  t page will alwa
278c0 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ys be initialize
278d0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
278e0 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
278f0 74 20 29 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  t );.  rc = bala
27900 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
27910 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  .  .  /*.  ** Cl
27920 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
27930 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
27940 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
27950 73 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c  sqliteFree(apCel
27960 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
27970 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
27980 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
27990 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
279a0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
279b0 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
279c0 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
279d0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
279e0 65 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52  e(pParent);.  TR
279f0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66  ACE(("BALANCE: f
27a00 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a  inished with %d:
27a10 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
27a20 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
27a30 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
27a40 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e  o, nOld, nNew, n
27a50 43 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  Cell));.  return
27a60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
27a70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
27a80 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  lled for the roo
27a90 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65  t page of a btre
27aa0 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a  e when the root.
27ab0 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
27ac0 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73   no cells.  This
27ad0 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
27ae0 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
27af0 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
27b00 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
27b10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
27b20 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d  ance_shallower(M
27b30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
27b40 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
27b50 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
27b60 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  * The only child
27b70 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a   page of pPage *
27b80 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
27b90 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
27ba0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
27bb0 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20  for pChild */.  
27bc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27bd0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
27be0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
27bf0 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
27c00 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
27c10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27c20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
27c30 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20  BTree structure 
27c40 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50  */.  int mxCellP
27c50 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  erPage;         
27c60 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
27c70 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72  ber of cells per
27c80 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
27c90 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
27ca0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
27cb0 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20  ells from pages 
27cc0 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a  being balanced *
27cd0 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b  /.  int *szCell;
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
27d00 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a  f all cells */..
27d10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27d20 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
27d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27d40 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42  nCell==0 );.  pB
27d50 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
27d60 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
27d70 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
27d80 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
27d90 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65  eMallocRaw( mxCe
27da0 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
27db0 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e  f(u8*)+sizeof(in
27dc0 74 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  t)) );.  if( apC
27dd0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
27de0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27df0 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26  szCell = (int*)&
27e00 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
27e10 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
27e20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
27e30 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
27e40 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
27e50 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
27e60 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
27e70 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
27e80 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
27e90 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
27ea0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
27eb0 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
27ec0 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
27ed0 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
27ee0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
27ef0 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
27f00 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
27f10 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
27f20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
27f30 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
27f40 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
27f50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27f60 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
27f70 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
27f80 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
27f90 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
27fa0 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
27fb0 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
27fc0 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
27fd0 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
27fe0 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
27ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
28000 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
28010 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
28020 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
28030 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
28040 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
28050 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
28060 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
28070 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
28080 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
28090 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
280a0 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
280b0 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
280c0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
280d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
280e0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
280f0 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
28100 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
28110 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
28120 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
28130 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
28140 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28150 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28160 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
28170 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
28180 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
28190 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c  ( pgnoChild<=sql
281a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
281b0 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  nt(pPage->pBt->p
281c0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63  Pager) );.    rc
281d0 20 3d 20 67 65 74 50 61 67 65 28 70 50 61 67 65   = getPage(pPage
281e0 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  ->pBt, pgnoChild
281f0 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20  , &pChild, 0);. 
28200 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28210 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
28220 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50  ance;.    if( pP
28230 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  age->pgno==1 ){.
28240 20 20 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50        rc = initP
28250 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67  age(pChild, pPag
28260 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
28270 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
28280 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
28290 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
282a0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  d->nOverflow==0 
282b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  );.      if( pCh
282c0 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20  ild->nFree>=100 
282d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
282e0 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74  e child informat
282f0 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ion will fit on 
28300 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73  the root page, s
28310 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20  o do the.       
28320 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20   ** copy */.    
28330 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
28340 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
28350 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
28360 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
28370 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
28380 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
28390 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69          apCell[i
283a0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68  ] = findCell(pCh
283b0 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  ild,i);.        
283c0 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65    szCell[i] = ce
283d0 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64  llSizePtr(pChild
283e0 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
283f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28400 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61  assemblePage(pPa
28410 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ge, pChild->nCel
28420 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  l, apCell, szCel
28430 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l);.        /* C
28440 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f  opy the right-po
28450 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
28460 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ld to the parent
28470 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
28480 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
28490 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
284a0 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20  fset+8], .      
284b0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
284c0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43  pChild->aData[pC
284d0 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  hild->hdrOffset+
284e0 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72  8]));.        fr
284f0 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
28500 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28510 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
28520 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61  d transfer to pa
28530 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
28540 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
28550 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
28560 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
28570 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
28580 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
28590 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
285a0 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
285b0 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
285c0 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
285d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43   */.        TRAC
285e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
285f0 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66  ld %d will not f
28600 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c  it on page 1\n",
28610 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
28620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28630 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
28640 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
28650 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50  Child->aData, pP
28660 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
28670 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
28680 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
28690 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
286a0 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
286b0 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50  rc = initPage(pP
286c0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  age, 0);.      a
286d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
286e0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72  E_OK );.      fr
286f0 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
28700 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
28710 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20  LANCE: transfer 
28720 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f  child %d into ro
28730 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ot %d\n",.      
28740 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e          pChild->
28750 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e  pgno, pPage->pgn
28760 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  o));.    }.    r
28770 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
28780 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20  dPages(pPage);. 
28790 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
287a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
287b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
287c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
287d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
287e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
287f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
28800 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
28810 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20  >nCell; i++){ . 
28820 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
28830 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c  apPutOvfl(pPage,
28840 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
28850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28860 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
28870 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
28880 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ance;.        }.
28890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
288a0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21  ndif.    if( rc!
288b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
288c0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
288d0 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61  lance;.    relea
288e0 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
288f0 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f    }.end_shallow_
28900 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74  balance:.  sqlit
28910 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  eFree(apCell);. 
28920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
28930 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
28940 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
28950 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
28960 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
28970 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
28980 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
28990 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
289a0 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
289b0 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
289c0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
289d0 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
289e0 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
289f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
28a00 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
28a10 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
28a20 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
28a30 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
28a40 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
28a50 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
28a60 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
28a70 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
28a80 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
28a90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
28aa0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
28ab0 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
28ac0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
28ad0 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
28ae0 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
28af0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
28b00 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
28b10 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
28b20 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
28b30 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
28b40 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
28b50 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
28b60 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
28b70 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
28b80 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
28b90 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
28ba0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
28bb0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
28bc0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
28bd0 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
28be0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
28bf0 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
28c00 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
28c10 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
28c20 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
28c30 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
28c40 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20  t */.  int brk; 
28c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
28c60 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
28c70 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
28c80 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
28c90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
28ca0 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
28cb0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
28cc0 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
28cd0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
28ce0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
28cf0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43  reePage(pBt, &pC
28d00 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64  hild, &pgnoChild
28d10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30  , pPage->pgno, 0
28d20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
28d30 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72  turn rc;.  asser
28d40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
28d50 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
28d60 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
28d70 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
28d80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
28d90 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
28da0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
28db0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
28dc0 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65    brk = get2byte
28dd0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
28de0 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64    cdata = pChild
28df0 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70  ->aData;.  memcp
28e00 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68  y(cdata, &data[h
28e10 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c  dr], pPage->cell
28e20 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
28e30 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65  nCell-hdr);.  me
28e40 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d  mcpy(&cdata[brk]
28e50 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
28e60 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20  ableSize-brk);. 
28e70 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
28e80 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
28e90 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43  rc = initPage(pC
28ea0 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
28eb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
28ec0 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b  lancedeeper_out;
28ed0 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64  .  memcpy(pChild
28ee0 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e  ->aOvfl, pPage->
28ef0 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f  aOvfl, pPage->nO
28f00 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
28f10 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
28f20 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
28f30 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e  rflow = pPage->n
28f40 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20  Overflow;.  if( 
28f50 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
28f60 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d  w ){.    pChild-
28f70 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  >nFree = 0;.  }.
28f80 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
28f90 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e  ->nCell==pPage->
28fa0 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50  nCell );.  zeroP
28fb0 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
28fc0 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50  d->aData[0] & ~P
28fd0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34  TF_LEAF);.  put4
28fe0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
28ff0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29000 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c  set+8], pgnoChil
29010 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41  d);.  TRACE(("BA
29020 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74  LANCE: copy root
29030 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20   %d into %d\n", 
29040 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68  pPage->pgno, pCh
29050 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66  ild->pgno));.#if
29060 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29070 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
29080 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
29090 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  m ){.    int i;.
290a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
290b0 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e  ut(pBt, pChild->
290c0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
290d0 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  EE, pPage->pgno)
290e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
290f0 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65  oto balancedeepe
29100 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69  r_out;.    for(i
29110 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43  =0; i<pChild->nC
29120 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
29130 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
29140 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a  vfl(pChild, i);.
29150 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29170 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
29190 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61  #endif.  rc = ba
291a0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43  lance_nonroot(pC
291b0 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64  hild);..balanced
291c0 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c  eeper_out:.  rel
291d0 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
291e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
291f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69  ../*.** Decide i
29200 66 20 74 68 65 20 70 61 67 65 20 70 50 61 67 65  f the page pPage
29210 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
29220 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e  anced.  If balan
29230 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69  cing is.** requi
29240 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70  red, call the ap
29250 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
29260 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  ing routine..*/.
29270 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
29280 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
29290 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a  e, int insert){.
292a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
292b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
292c0 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  e->pParent==0 ){
292d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
292e0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20  nOverflow>0 ){. 
292f0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
29300 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 29 3b  e_deeper(pPage);
29310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
29320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
29340 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
29350 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
29360 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
29370 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
29380 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
29390 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21  0 || .        (!
293a0 69 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d  insert && pPage-
293b0 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42  >nFree>pPage->pB
293c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
293d0 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  3) ){.      rc =
293e0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
293f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
29400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29410 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
29420 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c  utine checks all
29430 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f   cursors that po
29440 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e  int to table pgn
29450 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79  oRoot..** If any
29460 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72   of those cursor
29470 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  s were opened wi
29480 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20  th wrFlag==0 in 
29490 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64  a different.** d
294a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
294b0 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63  on (a database c
294c0 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73  onnection that s
294d0 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a  hares the pager.
294e0 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68  ** cache with th
294f0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63  e current connec
29500 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f  tion) and that o
29510 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
29520 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  .** is not in th
29530 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74  e ReadUncommmitt
29540 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ed state, then t
29550 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29560 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  rns .** SQLITE_L
29570 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  OCKED..**.** In 
29580 61 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63  addition to chec
29590 6b 69 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f  king for read-lo
295a0 63 6b 73 20 28 77 68 65 72 65 20 61 20 72 65 61  cks (where a rea
295b0 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73  d-lock .** means
295c0 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
295d0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29   with wrFlag==0)
295e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
295f0 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20  so moves.** all 
29600 63 75 72 73 6f 72 73 20 77 72 69 74 65 20 63 75  cursors write cu
29610 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68  rsors so that th
29620 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
29630 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  to the .** first
29640 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f   Cell on the roo
29650 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  t page.  This is
29660 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
29670 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a  se an insert .**
29680 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74   or delete might
29690 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62   change the numb
296a0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61  er of cells on a
296b0 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a   page or delete.
296c0 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65  ** a page entire
296d0 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  ly and we do not
296e0 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61   want to leave a
296f0 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70  ny cursors .** p
29700 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65  ointing to non-e
29710 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72  xistant pages or
29720 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
29730 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
29740 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72  ocks(Btree *pBtr
29750 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ee, Pgno pgnoRoo
29760 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
29770 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73  clude){.  BtCurs
29780 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
29790 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
297a0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
297b0 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53  *db = pBtree->pS
297c0 71 6c 69 74 65 3b 0a 20 20 66 6f 72 28 70 3d 70  qlite;.  for(p=p
297d0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
297e0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
297f0 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65   if( p==pExclude
29800 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29810 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d   if( p->eState!=
29820 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63  CURSOR_VALID ) c
29830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
29840 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67   p->pgnoRoot!=pg
29850 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75  noRoot ) continu
29860 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
29870 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Flag==0 ){.     
29880 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65   sqlite3 *dbOthe
29890 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70  r = p->pBtree->p
298a0 53 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66  Sqlite;.      if
298b0 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a  ( dbOther==0 ||.
298c0 20 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65           (dbOthe
298d0 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
298e0 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
298f0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
29900 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
29910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29920 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
29930 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
29940 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d  >pPage->pgno!=p-
29950 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  >pgnoRoot ){.   
29960 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29     moveToRoot(p)
29970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29990 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
299a0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
299b0 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
299c0 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
299d0 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
299e0 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
299f0 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
29a00 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
29a10 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
29a20 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
29a30 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
29a40 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
29a50 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
29a60 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
29a70 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
29a80 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
29a90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
29aa0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
29ab0 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
29ac0 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
29ad0 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
29ae0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
29af0 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
29b00 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
29b10 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
29b20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
29b30 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
29b40 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rt(.  BtCursor *
29b50 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
29b60 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
29b70 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ata into the tab
29b80 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f  le of this curso
29b90 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  r */.  const voi
29ba0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
29bb0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
29bc0 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
29bd0 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
29be0 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
29bf0 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61  Data,  /* The da
29c00 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ta of the new re
29c10 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 61 70  cord */.  int ap
29c20 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
29c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29c40 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
29c50 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
29c60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
29c70 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
29c80 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  New;.  MemPage *
29c90 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  pPage;.  BtShare
29ca0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
29cb0 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 75 6e  Btree->pBt;.  un
29cc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
29cd0 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
29ce0 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
29cf0 20 30 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e   0;..  if( pBt->
29d00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
29d10 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
29d20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
29d30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
29d40 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e  fore doing an in
29d50 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  sert */.    retu
29d60 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
29d70 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
29d80 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
29d90 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
29da0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
29db0 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
29dc0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
29dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
29de0 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
29df0 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
29e00 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
29e10 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
29e20 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
29e30 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
29e40 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
29e50 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
29e60 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
29e70 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
29e80 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
29e90 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
29ea0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
29eb0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
29ec0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
29ed0 62 6c 65 20 2a 2f 0a 20 20 72 65 73 74 6f 72 65  ble */.  restore
29ee0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
29ef0 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a  ition(pCur, 0);.
29f00 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
29f10 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
29f20 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
29f30 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
29f40 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
29f50 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
29f60 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
29f70 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
29f80 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20  ey, appendBias, 
29f90 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20  &loc)).  ){.    
29fa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
29fb0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
29fc0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
29fd0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
29fe0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
29ff0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2a000 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65  af || !pPage->le
2a010 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43  afData );.  TRAC
2a020 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
2a030 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
2a040 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
2a050 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2a060 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a070 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
2a080 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
2a090 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
2a0a0 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
2a0b0 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
2a0c0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2a0d0 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  it );.  rc = sql
2a0e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a0f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2a100 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a110 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c 6c 20  n rc;.  newCell 
2a120 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
2a130 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w( MX_CELL_SIZE(
2a140 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6e 65  pBt) );.  if( ne
2a150 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
2a160 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a170 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
2a180 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
2a190 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
2a1a0 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73 7a 4e  ata, nData, &szN
2a1b0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2a1c0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2a1d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2a1e0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2a1f0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2a200 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2a210 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2a220 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2a230 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2a240 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2a250 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
2a260 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2a270 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2a280 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2a290 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c  >nCell );.    ol
2a2a0 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2a2b0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2a2c0 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2a2d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a2e0 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2a2f0 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2a300 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2a310 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2a320 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2a330 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2a340 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2a350 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2a360 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2a370 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2a380 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2a390 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2a3a0 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2a3b0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2a3c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a3d0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2a3e0 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2a3f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2a400 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2a410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a420 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2a430 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2a440 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2a450 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2a460 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2a470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2a480 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2a490 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2a4a0 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2a4b0 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2a4c0 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2a4d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2a4e0 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2a4f0 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2a500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a510 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2a520 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2a530 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74  _insert:.  sqlit
2a540 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  eFree(newCell);.
2a550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a560 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2a570 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2a580 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2a590 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2a5a0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2a5b0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2a5c0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2a5d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2a5e0 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2a5f0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2a600 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2a610 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2a620 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2a630 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2a640 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2a650 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2a660 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
2a670 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2a680 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2a690 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2a6a0 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2a6b0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2a6c0 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2a6d0 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2a6e0 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
2a6f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2a700 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2a710 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2a720 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2a730 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2a740 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2a750 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2a760 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2a770 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a780 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2a790 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2a7a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2a7b0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2a7c0 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2a7d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a7e0 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2a7f0 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2a800 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2a810 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2a820 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2a830 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2a840 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2a850 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2a860 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2a870 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2a880 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2a890 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2a8a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2a8b0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2a8c0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2a8d0 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2a8e0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2a8f0 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2a900 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2a910 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2a920 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2a930 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2a940 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2a950 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2a960 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2a970 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2a980 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2a990 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2a9a0 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2a9b0 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2a9c0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
2a9d0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2a9e0 28 70 43 75 72 2c 20 31 29 29 21 3d 30 20 7c 7c  (pCur, 1))!=0 ||
2a9f0 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2aa00 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2aa10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2aa20 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2aa30 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2aa40 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2aa50 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2aa60 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2aa70 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2aa80 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2aa90 20 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c   it's page and l
2aaa0 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74  eave pCell point
2aab0 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ing to the.  ** 
2aac0 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43  data. The clearC
2aad0 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73  ell() call frees
2aae0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2aaf0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2ab00 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ith the.  ** cel
2ab10 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65  l. The cell itse
2ab20 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61  lf is still inta
2ab30 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c  ct..  */.  pCell
2ab40 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2ab50 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2ab60 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2ab70 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
2ab80 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
2ab90 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
2aba0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2abb0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
2abc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2abd0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2abe0 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  eaf ){.    /*.  
2abf0 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77    ** The entry w
2ac00 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64  e are about to d
2ac10 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c  elete is not a l
2ac20 65 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20  eaf so if we do 
2ac30 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f  not.    ** do so
2ac40 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20  mething we will 
2ac50 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20  leave a hole on 
2ac60 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65  an internal page
2ac70 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65  ..    ** We have
2ac80 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c   to fill the hol
2ac90 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61  e by moving in a
2aca0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2acb0 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e  f.  The.    ** n
2acc0 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74  ext Cell after t
2acd0 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c  he one to be del
2ace0 65 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65  eted is guarante
2acf0 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a  ed to exist and.
2ad00 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c      ** to be a l
2ad10 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73  eaf so we can us
2ad20 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
2ad30 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75   BtCursor leafCu
2ad40 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  r;.    unsigned 
2ad50 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20  char *pNext;.   
2ad60 20 69 6e 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a   int szNext;  /*
2ad70 20 54 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   The compiler wa
2ad80 72 6e 69 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20  rning is wrong: 
2ad90 73 7a 4e 65 78 74 20 69 73 20 61 6c 77 61 79 73  szNext is always
2ada0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2adb0 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
2adc0 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20 41  d before use.  A
2add0 64 64 69 6e 67 20 61 6e 20 65 78 74 72 61 20 69  dding an extra i
2ade0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2ae00 2a 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 65  * to silence the
2ae10 20 63 6f 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20   compiler slows 
2ae20 64 6f 77 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a  down the code. *
2ae30 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  /.    int notUse
2ae40 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  d;.    unsigned 
2ae50 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d  char *tempCell =
2ae60 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2ae70 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61  !pPage->leafData
2ae80 20 29 3b 0a 20 20 20 20 67 65 74 54 65 6d 70 43   );.    getTempC
2ae90 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
2aea0 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
2aeb0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2aec0 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
2aed0 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
2aee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2aef0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2af00 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
2af10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2af20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
2af30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2af40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2af50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2af60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2af70 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ite(leafCur.pPag
2af80 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2af90 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2afa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2afb0 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2afc0 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2afd0 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
2afe0 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
2aff0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2b000 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2b010 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2b020 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  , leafCur.pPage-
2b030 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
2b040 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2b050 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2b060 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2b070 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2b080 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61  t = findCell(lea
2b090 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2b0a0 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20  Cur.idx);.      
2b0b0 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2b0c0 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61  ePtr(leafCur.pPa
2b0d0 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
2b0e0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
2b0f0 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
2b100 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 74  ext+4 );.      t
2b110 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65  empCell = sqlite
2b120 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45  MallocRaw( MX_CE
2b130 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
2b140 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65        if( tempCe
2b150 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
2b160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2b170 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2b180 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b1a0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2b1b0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2b1c0 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65  x, pNext-4, szNe
2b1d0 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20  xt+4, tempCell, 
2b1e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
2b1f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b200 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2b210 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2b220 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b230 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29  idx), pgnoChild)
2b240 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  ;.      rc = bal
2b250 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  ance(pPage, 0);.
2b260 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b280 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65       dropCell(le
2b290 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61  afCur.pPage, lea
2b2a0 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74  fCur.idx, szNext
2b2b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  );.      rc = ba
2b2c0 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50  lance(leafCur.pP
2b2d0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  age, 0);.    }. 
2b2e0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65     sqliteFree(te
2b2f0 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 72 65 6c  mpCell);.    rel
2b300 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
2b310 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73  leafCur);.  }els
2b320 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44  e{.    TRACE(("D
2b330 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2b340 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66  delete from leaf
2b350 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70   %d\n",.       p
2b360 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2b370 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2b380 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2b390 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c  , pCur->idx, cel
2b3a0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2b3b0 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20  pCell));.    rc 
2b3c0 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2b3d0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
2b3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b3f0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2b400 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
2b410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b420 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
2b430 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
2b440 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
2b450 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2b460 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
2b470 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2b480 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
2b490 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
2b4a0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2b4b0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2b4c0 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
2b4d0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
2b4e0 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
2b4f0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
2b500 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
2b510 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
2b520 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
2b530 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
2b540 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
2b550 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2b560 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
2b570 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
2b580 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5a0 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
2b5b0 69 63 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ices.*/.int sqli
2b5c0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
2b5d0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2b5e0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2b5f0 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
2b600 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2b610 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
2b620 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
2b630 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  oot;.  int rc;. 
2b640 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2b650 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2b660 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2b670 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2b680 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f  saction first */
2b690 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
2b6a0 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2b6b0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2b6c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2b6d0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2b6e0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 2f  readOnly );..  /
2b6f0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2b700 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
2b710 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
2b720 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
2b730 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
2b740 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2b750 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2b760 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20  ode the backend 
2b770 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f  may.  ** need to
2b780 20 6d 6f 76 65 20 61 20 64 61 74 61 62 61 73 65   move a database
2b790 20 70 61 67 65 20 74 6f 20 6d 61 6b 65 20 72 6f   page to make ro
2b7a0 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72  om for the new r
2b7b0 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 2a 2a 20 49  oot-page..  ** I
2b7c0 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2b7d0 20 77 61 73 20 75 73 69 6e 67 20 74 68 65 20 70   was using the p
2b7e0 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
2b7f0 75 6c 64 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a  uld occur..  */.
2b800 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
2b810 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
2b820 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2b830 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
2b840 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b850 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
2b860 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2b870 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2b880 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
2b890 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b8a0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74  .#else.  if( pBt
2b8b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2b8c0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76      Pgno pgnoMov
2b8d0 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  e;      /* Move 
2b8e0 61 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d  a page here to m
2b8f0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2b900 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
2b910 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b920 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67  Move; /* The pag
2b930 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f  e to move to. */
2b940 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
2b950 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
2b960 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
2b970 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
2b980 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
2b990 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
2b9a0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
2b9b0 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
2b9c0 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
2b9d0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2b9e0 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
2b9f0 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
2ba00 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page is (meta[3
2ba10 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ]+1)..    */.   
2ba20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2ba30 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2ba40 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
2ba50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ba60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2ba70 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2ba80 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2ba90 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2baa0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2bab0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2bac0 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2bad0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2bae0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2baf0 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50   if( pgnoRoot==P
2bb00 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2bb10 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20  , pgnoRoot) ||. 
2bb20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d         pgnoRoot=
2bb30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2bb40 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
2bb50 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20   pgnoRoot++;.   
2bb60 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2bb70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20  gnoRoot>=3 );.. 
2bb80 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
2bb90 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20   page. The page 
2bba0 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72  that currently r
2bbb0 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f  esides at pgnoRo
2bbc0 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ot will.    ** b
2bbd0 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61  e moved to the a
2bbe0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75  llocated page (u
2bbf0 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61  nless the alloca
2bc00 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73  ted page happens
2bc10 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64  .    ** to resid
2bc20 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a  e at pgnoRoot)..
2bc30 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2bc40 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2bc50 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76  e(pBt, &pPageMov
2bc60 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67  e, &pgnoMove, pg
2bc70 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20  noRoot, 1);.    
2bc80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bc90 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2bca0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
2bcb0 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70   if( pgnoMove!=p
2bcc0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  gnoRoot ){.     
2bcd0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
2bce0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
2bcf0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2bd00 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 20  ge(pPageMove);. 
2bd10 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
2bd20 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2bd30 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2bd40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bd50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bd60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2bd70 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2bd80 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2bd90 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2bda0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2bdb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bdc0 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2bdd0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2bde0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2bdf0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2be00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2be10 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2be20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2be30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2be40 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2be50 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2be60 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2be70 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2be80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2be90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2bea0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2beb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bed0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2bee0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2bef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2bf00 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2bf10 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2bf20 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2bf30 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b  Page, pgnoMove);
2bf40 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2bf50 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2bf60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bf70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2bf80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2bf90 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
2bfa0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
2bfb0 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
2bfc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2bfd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bfe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bff0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2c000 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c010 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2c020 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2c030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c040 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2c050 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2c060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2c070 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2c080 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50        pRoot = pP
2c090 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a  ageMove;.    } .
2c0a0 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
2c0b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61  he pointer-map a
2c0c0 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74  nd meta-data wit
2c0d0 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  h the new root-p
2c0e0 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20  age number. */. 
2c0f0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2c100 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2c110 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2c120 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2c130 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2c140 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2c150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c160 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
2c170 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
2c180 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52  Meta(p, 4, pgnoR
2c190 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
2c1a0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2c1b0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2c1c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c1d0 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
2c1e0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2c1f0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2c200 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
2c210 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
2c220 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2c230 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
2c240 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2c250 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52  erIswriteable(pR
2c260 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  oot->pDbPage) );
2c270 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
2c280 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c  t, flags | PTF_L
2c290 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  EAF);.  sqlite3P
2c2a0 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d  agerUnref(pRoot-
2c2b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69  >pDbPage);.  *pi
2c2c0 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e  Table = (int)pgn
2c2d0 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  oRoot;.  return 
2c2e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2c2f0 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69  .** Erase the gi
2c300 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  ven database pag
2c310 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68  e and all its ch
2c320 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a  ildren.  Return.
2c330 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  ** the page to t
2c340 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
2c350 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2c360 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20  DatabasePage(.  
2c370 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2c380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c390 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61  BTree that conta
2c3a0 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ins the table */
2c3b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
2c3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2c3d0 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72   number to clear
2c3e0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2c3f0 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
2c400 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c  arent page.  NUL
2c410 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a  L for the root *
2c420 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65  /.  int freePage
2c430 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61  Flag      /* Dea
2c440 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20  llocate page if 
2c450 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  true */.){.  Mem
2c460 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2c470 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
2c480 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2c490 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  l;.  int i;..  i
2c4a0 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50  f( pgno>sqlite3P
2c4b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
2c4c0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
2c4d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c4e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2c4f0 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64  }..  rc = getAnd
2c500 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2c510 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72  no, &pPage, pPar
2c520 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
2c530 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2c540 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66  asepage_out;.  f
2c550 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
2c560 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2c570 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2c580 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
2c590 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2c5a0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2c5b0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2c5c0 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2c5d0 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e  (pCell), pPage->
2c5e0 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20  pParent, 1);.   
2c5f0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c600 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2c610 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2c620 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2c630 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2c640 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c650 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2c660 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
2c670 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c680 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  ){.    rc = clea
2c690 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
2c6a0 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
2c6b0 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70  ge->aData[8]), p
2c6c0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2c6d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2c6e0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2c6f0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  sepage_out;.  }.
2c700 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
2c710 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
2c720 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2c730 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
2c740 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c750 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2c760 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
2c770 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2c780 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
2c790 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
2c7a0 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
2c7b0 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
2c7c0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2c7d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c7e0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
2c7f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2c800 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
2c810 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2c820 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
2c830 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2c840 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2c850 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
2c860 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2c870 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
2c880 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
2c890 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
2c8a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c8b0 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
2c8c0 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
2c8d0 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
2c8e0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
2c8f0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
2c900 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
2c910 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
2c920 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
2c930 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
2c940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c950 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42  treeClearTable(B
2c960 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
2c970 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ble){.  int rc;.
2c980 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2c990 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
2c9a0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2c9b0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2c9c0 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
2c9d0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2c9e0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2c9f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
2ca00 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2ca10 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  p, iTable, 0);. 
2ca20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2ca30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2ca40 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
2ca50 69 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72  ition of all cur
2ca60 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
2ca70 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  s table */.  if(
2ca80 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2ca90 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2caa0 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29  (pBt, iTable, 0)
2cab0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2cac0 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
2cad0 6e 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  n clearDatabaseP
2cae0 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
2caf0 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a  Table, 0, 0);.}.
2cb00 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
2cb10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
2cb20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20  a table and add 
2cb30 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2cb40 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20  table to.** the 
2cb50 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70  freelist.  Excep
2cb60 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  t, the root of t
2cb70 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62  he principle tab
2cb80 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a  le (the one on.*
2cb90 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76  * page 1) is nev
2cba0 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  er added to the 
2cbb0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
2cbc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2cbd0 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2cbe0 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2cbf0 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2cc00 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ** cursors on th
2cc10 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2cc20 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
2cc30 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  enabled and the 
2cc40 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69  page at iTable i
2cc50 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a  s not the last.*
2cc60 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  * root page in t
2cc70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cc80 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
2cc90 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e  root page .** in
2cca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ccb0 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f  le is moved into
2ccc0 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72   the slot former
2ccd0 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a  ly occupied by.*
2cce0 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61  * iTable and tha
2ccf0 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d  t last slot form
2cd00 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2cd10 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2cd20 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  age.** is added 
2cd30 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
2cd40 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c  instead of iTabl
2cd50 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c  e.  In this say,
2cd60 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
2cd70 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74  es are kept at t
2cd80 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2cd90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cda0 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e  e, which.** is n
2cdb0 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54  ecessary for AUT
2cdc0 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20  OVACUUM to work 
2cdd0 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64  right.  *piMoved
2cde0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
2cdf0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ** page number t
2ce00 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74  hat used to be t
2ce10 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2ce20 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65  e in the file be
2ce30 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65  fore.** the move
2ce40 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65  .  If no page ge
2ce50 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76  ts moved, *piMov
2ce60 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ed is set to 0..
2ce70 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74  ** The last root
2ce80 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65   page is recorde
2ce90 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64  d in meta[3] and
2cea0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
2ceb0 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61   meta[3] is upda
2cec0 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
2ced0 65 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edure..*/.int sq
2cee0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
2cef0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2cf00 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
2cf10 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
2cf20 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2cf30 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  age = 0;.  BtSha
2cf40 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2cf50 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t;..  if( p->inT
2cf60 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2cf70 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
2cf80 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2cf90 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2cfa0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2cfb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
2cfc0 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20  illegal to drop 
2cfd0 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63  a table if any c
2cfe0 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20  ursors are open 
2cff0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
2d000 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65  base. This is be
2d010 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61  cause in auto-va
2d020 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61  cuum mode the ba
2d030 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e  ckend may.  ** n
2d040 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74  eed to move anot
2d050 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  her root-page to
2d060 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74   fill a gap left
2d070 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a   by the deleted.
2d080 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20    ** root page. 
2d090 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  If an open curso
2d0a0 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73  r was using this
2d0b0 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20   page a problem 
2d0c0 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75  would .  ** occu
2d0d0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
2d0e0 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  t->pCursor ){.  
2d0f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d100 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72  LOCKED;.  }..  r
2d110 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2d120 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
2d130 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
2d140 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2d160 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
2d170 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28  , iTable);.  if(
2d180 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61   rc ){.    relea
2d190 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2d1a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d1b0 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20  }..  *piMoved = 
2d1c0 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65  0;..  if( iTable
2d1d0 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  >1 ){.#ifdef SQL
2d1e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d1f0 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65  UUM.    rc = fre
2d200 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2d210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2d220 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  age);.#else.    
2d230 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2d240 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  uum ){.      Pgn
2d250 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  o maxRootPgno;. 
2d260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d270 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
2d280 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f   4, &maxRootPgno
2d290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d2a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d2b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d2c0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2d2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d2e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2d2f0 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50  iTable==maxRootP
2d300 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  gno ){.        /
2d310 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62  * If the table b
2d320 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20  eing dropped is 
2d330 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  the table with t
2d340 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2d350 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2d360 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
2d370 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20  tabase, put the 
2d380 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65  root page on the
2d390 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20   free list. .   
2d3a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d3b0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2d3c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2d3d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2d3e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2d3f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d400 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d410 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2d420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d430 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2d440 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f  being dropped do
2d450 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  es not have the 
2d460 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2d470 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2d480 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
2d490 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65  ase. So move the
2d4a0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
2d4b0 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  into the .      
2d4c0 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79    ** gap left by
2d4d0 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f   the deleted roo
2d4e0 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  t-page..        
2d4f0 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  */.        MemPa
2d500 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20  ge *pMove;.     
2d510 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d520 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2d530 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2d540 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
2d550 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
2d560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2d5a0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
2d5b0 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d  pBt, pMove, PTRM
2d5c0 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
2d5d0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
2d5e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f   releasePage(pMo
2d5f0 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ve);.        if(
2d600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d610 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2d620 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2d630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65  .        rc = ge
2d640 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
2d650 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
2d660 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2d670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d680 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d690 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d6a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
2d6b0 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2d6c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d6d0 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2d6e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d6f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
2d720 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74  iMoved = maxRoot
2d730 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Pgno;.      }.. 
2d740 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
2d750 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61  new 'max-root-pa
2d760 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65  ge' value in the
2d770 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
2d780 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
2d790 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  is the old value
2d7a0 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20   less one, less 
2d7b0 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74  one more if that
2d7c0 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20   happens to.    
2d7d0 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70    ** be a root-p
2d7e0 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73  age number, less
2d7f0 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68   one again if th
2d800 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  at is the.      
2d810 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ** PENDING_BYTE_
2d820 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  PAGE..      */. 
2d830 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
2d840 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  --;.      if( ma
2d850 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49  xRootPgno==PENDI
2d860 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2d870 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
2d880 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
2d890 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61    }.      if( ma
2d8a0 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41  xRootPgno==PTRMA
2d8b0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61  P_PAGENO(pBt, ma
2d8c0 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20  xRootPgno) ){.  
2d8d0 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2d8e0 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
2d8f0 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f     assert( maxRo
2d900 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  otPgno!=PENDING_
2d910 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2d920 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
2d930 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
2d940 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f  Meta(p, 4, maxRo
2d950 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  otPgno);.    }el
2d960 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2d970 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2d980 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d990 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
2d9a0 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
2d9b0 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
2d9c0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20  3BtreeDropTable 
2d9d0 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61  was called on pa
2d9e0 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72  ge 1. */.    zer
2d9f0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46  oPage(pPage, PTF
2da00 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2da10 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
2da20 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
2da30 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
2da40 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
2da50 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69  e meta-informati
2da60 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61  on out of a data
2da70 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61  base file.  Meta
2da80 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75  [0].** is the nu
2da90 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
2daa0 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
2dab0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
2dac0 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67  eta[1].** throug
2dad0 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61  h meta[15] are a
2dae0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
2daf0 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72   by higher layer
2db00 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  s.  Meta[0].** i
2db10 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65  s read-only, the
2db20 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64   others are read
2db30 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  /write..** .** T
2db40 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20  he schema layer 
2db50 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c  numbers meta val
2db60 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e  ues differently.
2db70 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a    At the schema.
2db80 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68  ** layer (and th
2db90 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20  e SetCookie and 
2dba0 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64  ReadCookie opcod
2dbb0 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  es) the number o
2dbc0 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20  f.** free pages 
2dbd0 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20  is not visible. 
2dbe0 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73   So Cookie[0] is
2dbf0 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74   the same as Met
2dc00 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  a[1]..*/.int sql
2dc10 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2dc20 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2dc30 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b  dx, u32 *pMeta){
2dc40 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
2dc50 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ge;.  int rc;.  
2dc60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2dc70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  P1;.  BtShared *
2dc80 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2dc90 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65   /* Reading a me
2dca0 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65  ta-data value re
2dcb0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
2dcc0 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e  ck on page 1 (an
2dcd0 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65  d hence.  ** the
2dce0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2dcf0 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68  able. We grab th
2dd00 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65  is lock regardle
2dd10 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2dd20 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51  .  ** not the SQ
2dd30 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2dd40 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
2dd50 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74   (the table root
2dd60 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20  ed at page.  ** 
2dd70 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  1 is treated as 
2dd80 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62  a special case b
2dd90 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  y queryTableLock
2dda0 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65  () and lockTable
2ddb0 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ())..  */.  rc =
2ddc0 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2ddd0 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2dde0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2ddf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2de00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
2de10 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2de20 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63   idx<=15 );.  rc
2de30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2de40 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
2de50 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  1, &pDbPage);.  
2de60 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2de70 72 63 3b 0a 20 20 70 50 31 20 3d 20 28 75 6e 73  rc;.  pP1 = (uns
2de80 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
2de90 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
2dea0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d  (pDbPage);.  *pM
2deb0 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26  eta = get4byte(&
2dec0 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29  pP1[36 + idx*4])
2ded0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
2dee0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
2def0 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63  .  /* If autovac
2df00 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65  uumed is disable
2df10 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20  d in this build 
2df20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  but we are tryin
2df30 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73  g to .  ** acces
2df40 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65  s an autovacuume
2df50 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  d database, then
2df60 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61   make the databa
2df70 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20  se readonly. .  
2df80 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2df90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2dfa0 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26  .  if( idx==4 &&
2dfb0 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d   *pMeta>0 ) pBt-
2dfc0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23  >readOnly = 1;.#
2dfd0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62  endif..  /* Grab
2dfe0 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f   the read-lock o
2dff0 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72  n page 1. */.  r
2e000 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
2e010 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
2e020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e030 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61  /*.** Write meta
2e040 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63  -information bac
2e050 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
2e060 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73  ase.  Meta[0] is
2e070 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  .** read-only an
2e080 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69  d may not be wri
2e090 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tten..*/.int sql
2e0a0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2e0b0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
2e0c0 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61  t idx, u32 iMeta
2e0d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2e0e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
2e0f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2e100 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
2e110 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26  ssert( idx>=1 &&
2e120 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66   idx<=15 );.  if
2e130 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
2e140 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2e150 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2e160 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2e170 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2e180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
2e190 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
2e1a0 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20  1!=0 );.  pP1 = 
2e1b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
2e1c0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
2e1d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
2e1e0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
2e1f0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
2e200 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34  eturn rc;.  put4
2e210 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
2e220 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20  dx*4], iMeta);. 
2e230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e240 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
2e250 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65  rn the flag byte
2e260 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2e270 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  g of the page th
2e280 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
2e290 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2e2a0 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
2e2b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  t sqlite3BtreeFl
2e2c0 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
2e2d0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
2e2e0 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f  What about CURSO
2e2f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
2e300 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65  ate? Probably ne
2e310 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ed to call.  ** 
2e320 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
2e330 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68  rsorPosition() h
2e340 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50  ere..  */.  MemP
2e350 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2e360 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65 74 75  r->pPage;.  retu
2e370 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65  rn pPage ? pPage
2e380 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2e390 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d  drOffset] : 0;.}
2e3a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e3b0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
2e3c0 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20  t a disassembly 
2e3d0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
2e3e0 65 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75  e on standard ou
2e3f0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
2e400 69 6e 65 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  ine.** is used f
2e410 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64  or debugging and
2e420 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a   testing only..*
2e430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
2e440 65 65 50 61 67 65 44 75 6d 70 28 42 74 53 68 61  eePageDump(BtSha
2e450 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 70 67  red *pBt, int pg
2e460 6e 6f 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76  no, int recursiv
2e470 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  e, MemPage *pPar
2e480 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
2e490 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e4a0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b  ;.  int i, j, c;
2e4b0 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20  .  int nFree;.  
2e4c0 75 31 36 20 69 64 78 3b 0a 20 20 69 6e 74 20 68  u16 idx;.  int h
2e4d0 64 72 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  dr;.  int nCell;
2e4e0 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20  .  int isInit;. 
2e4f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2e500 64 61 74 61 3b 0a 20 20 63 68 61 72 20 72 61 6e  data;.  char ran
2e510 67 65 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e  ge[20];.  unsign
2e520 65 64 20 63 68 61 72 20 70 61 79 6c 6f 61 64 5b  ed char payload[
2e530 32 30 5d 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74  20];..  rc = get
2e540 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
2e550 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 30 29  pgno, &pPage, 0)
2e560 3b 0a 20 20 69 73 49 6e 69 74 20 3d 20 70 50 61  ;.  isInit = pPa
2e570 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66  ge->isInit;.  if
2e580 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d  ( pPage->isInit=
2e590 3d 30 20 29 7b 0a 20 20 20 20 69 6e 69 74 50 61  =0 ){.    initPa
2e5a0 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
2e5b0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
2e5c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e5d0 63 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70  c;.  }.  hdr = p
2e5e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2e5f0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2e600 3e 61 44 61 74 61 3b 0a 20 20 63 20 3d 20 64 61  >aData;.  c = da
2e610 74 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61 67 65  ta[hdr];.  pPage
2e620 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20 26 20  ->intKey = (c & 
2e630 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2e640 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
2e650 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
2e660 20 3d 20 28 63 20 26 20 50 54 46 5f 5a 45 52 4f   = (c & PTF_ZERO
2e670 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
2e680 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 28 63  e->leafData = (c
2e690 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29   & PTF_LEAFDATA)
2e6a0 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  !=0;.  pPage->le
2e6b0 61 66 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45  af = (c & PTF_LE
2e6c0 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  AF)!=0;.  pPage-
2e6d0 3e 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61  >hasData = !(pPa
2e6e0 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20  ge->zeroData || 
2e6f0 28 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  (!pPage->leaf &&
2e700 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
2e710 29 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65  ));.  nCell = ge
2e720 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2e730 2b 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  +3]);.  sqlite3D
2e740 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
2e750 20 25 64 3a 20 20 66 6c 61 67 73 3d 30 78 25 30   %d:  flags=0x%0
2e760 32 78 20 20 66 72 61 67 3d 25 64 20 20 20 70 61  2x  frag=%d   pa
2e770 72 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f  rent=%d\n", pgno
2e780 2c 0a 20 20 20 20 64 61 74 61 5b 68 64 72 5d 2c  ,.    data[hdr],
2e790 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20   data[hdr+7], . 
2e7a0 20 20 20 28 70 50 61 67 65 2d 3e 69 73 49 6e 69     (pPage->isIni
2e7b0 74 20 26 26 20 70 50 61 67 65 2d 3e 70 50 61 72  t && pPage->pPar
2e7c0 65 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e 70 50  ent) ? pPage->pP
2e7d0 61 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29  arent->pgno : 0)
2e7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 20  ;.  assert( hdr 
2e7f0 3d 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  == (pgno==1 ? 10
2e800 30 20 3a 20 30 29 20 29 3b 0a 20 20 69 64 78 20  0 : 0) );.  idx 
2e810 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 70 50 61  = hdr + 12 - pPa
2e820 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f  ge->leaf*4;.  fo
2e830 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
2e840 69 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  i++){.    CellIn
2e850 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e  fo info;.    Pgn
2e860 6f 20 63 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73  o child;.    uns
2e870 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2e880 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
2e890 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
2e8a0 20 20 61 64 64 72 20 3d 20 67 65 74 32 62 79 74    addr = get2byt
2e8b0 65 28 26 64 61 74 61 5b 69 64 78 20 2b 20 32 2a  e(&data[idx + 2*
2e8c0 69 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  i]);.    pCell =
2e8d0 20 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20   &data[addr];.  
2e8e0 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
2e8f0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2e900 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e  fo);.    sz = in
2e910 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70  fo.nSize;.    sp
2e920 72 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e  rintf(range,"%d.
2e930 2e 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64 72  .%d", addr, addr
2e940 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  +sz-1);.    if( 
2e950 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e960 20 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a       child = 0;.
2e970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e980 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2e990 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a  e(pCell);.    }.
2e9a0 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44      sz = info.nD
2e9b0 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50  ata;.    if( !pP
2e9c0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a  age->intKey ) sz
2e9d0 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20   += info.nKey;. 
2e9e0 20 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66     if( sz>sizeof
2e9f0 28 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a  (payload)-1 ) sz
2ea00 20 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61   = sizeof(payloa
2ea10 64 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d)-1;.    memcpy
2ea20 28 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c  (payload, &pCell
2ea30 5b 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20  [info.nHeader], 
2ea40 73 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  sz);.    for(j=0
2ea50 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20  ; j<sz; j++){.  
2ea60 20 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 5b      if( payload[
2ea70 6a 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f  j]<0x20 || paylo
2ea80 61 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61 79  ad[j]>0x7f ) pay
2ea90 6c 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20  load[j] = '.';. 
2eaa0 20 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64     }.    payload
2eab0 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  [sz] = 0;.    sq
2eac0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2ead0 28 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25 32  (.      "cell %2
2eae0 64 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d  d: i=%-10s chld=
2eaf0 25 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e  %-4d nk=%-4lld n
2eb00 64 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25  d=%-4d payload=%
2eb10 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20 72  s\n",.      i, r
2eb20 61 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66  ange, child, inf
2eb30 6f 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61  o.nKey, info.nDa
2eb40 74 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20 20  ta, payload.    
2eb50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
2eb60 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2eb70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2eb80 6e 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c 64  ntf("right_child
2eb90 3a 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79 74  : %d\n", get4byt
2eba0 65 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 29  e(&data[hdr+8]))
2ebb0 3b 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20  ;.  }.  nFree = 
2ebc0 30 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 64  0;.  i = 0;.  id
2ebd0 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
2ebe0 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68  ta[hdr+1]);.  wh
2ebf0 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64  ile( idx>0 && id
2ec00 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  x<pPage->pBt->us
2ec10 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2ec20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74  int sz = get2byt
2ec30 65 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b  e(&data[idx+2]);
2ec40 0a 20 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e  .    sprintf(ran
2ec50 67 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69 64 78  ge,"%d..%d", idx
2ec60 2c 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20  , idx+sz-1);.   
2ec70 20 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20   nFree += sz;.  
2ec80 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ec90 69 6e 74 66 28 22 66 72 65 65 62 6c 6f 63 6b 20  intf("freeblock 
2eca0 25 32 64 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a  %2d: i=%-10s siz
2ecb0 65 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c  e=%-4d total=%d\
2ecc0 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 20 72 61  n",.       i, ra
2ecd0 6e 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b  nge, sz, nFree);
2ece0 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62  .    idx = get2b
2ecf0 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 29 3b  yte(&data[idx]);
2ed00 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  .    i++;.  }.  
2ed10 69 66 28 20 69 64 78 21 3d 30 20 29 7b 0a 20 20  if( idx!=0 ){.  
2ed20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ed30 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e 65 78  intf("ERROR: nex
2ed40 74 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65  t freeblock inde
2ed50 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20  x out of range: 
2ed60 25 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d  %d\n", idx);.  }
2ed70 0a 20 20 69 66 28 20 72 65 63 75 72 73 69 76 65  .  if( recursive
2ed80 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2ed90 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2eda0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
2edb0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2edc0 68 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e  har *pCell = fin
2edd0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
2ede0 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 67 65  .      btreePage
2edf0 44 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79  Dump(pBt, get4by
2ee00 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50  te(pCell), 1, pP
2ee10 61 67 65 29 3b 0a 20 20 20 20 20 20 69 64 78 20  age);.      idx 
2ee20 3d 20 67 65 74 32 62 79 74 65 28 70 43 65 6c 6c  = get2byte(pCell
2ee30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  );.    }.    btr
2ee40 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20  eePageDump(pBt, 
2ee50 67 65 74 34 62 79 74 65 28 26 64 61 74 61 5b 68  get4byte(&data[h
2ee60 64 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61 67 65  dr+8]), 1, pPage
2ee70 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
2ee80 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b  isInit = isInit;
2ee90 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2eea0 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
2eeb0 61 67 65 29 3b 0a 20 20 66 66 6c 75 73 68 28 73  age);.  fflush(s
2eec0 74 64 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  tdout);.  return
2eed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
2eee0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
2eef0 67 65 44 75 6d 70 28 42 74 72 65 65 20 2a 70 2c  geDump(Btree *p,
2ef00 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72   int pgno, int r
2ef10 65 63 75 72 73 69 76 65 29 7b 0a 20 20 72 65 74  ecursive){.  ret
2ef20 75 72 6e 20 62 74 72 65 65 50 61 67 65 44 75 6d  urn btreePageDum
2ef30 70 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20  p(p->pBt, pgno, 
2ef40 72 65 63 75 72 73 69 76 65 2c 20 30 29 3b 0a 7d  recursive, 0);.}
2ef50 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2ef60 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2ef70 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2ef80 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
2ef90 20 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b 5d 20   Fill aResult[] 
2efa0 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  with information
2efb0 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74 72 79   about the entry
2efc0 20 61 6e 64 20 70 61 67 65 20 74 68 61 74 20 74   and page that t
2efd0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
2efe0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a 20  pointing to..** 
2eff0 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 30 5d  .**   aResult[0]
2f000 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d   =  The page num
2f010 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  ber.**   aResult
2f020 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74 72 79  [1] =  The entry
2f030 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65   number.**   aRe
2f040 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74 61 6c  sult[2] =  Total
2f050 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
2f060 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a  es on this page.
2f070 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20  **   aResult[3] 
2f080 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28 6c 6f  =  Cell size (lo
2f090 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20 68 65  cal payload + he
2f0a0 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65 73 75  ader).**   aResu
2f0b0 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65 72 20  lt[4] =  Number 
2f0c0 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e  of free bytes on
2f0d0 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20   this page.**   
2f0e0 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20 4e 75  aResult[5] =  Nu
2f0f0 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 6c 6f  mber of free blo
2f100 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  cks on the page.
2f110 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20  **   aResult[6] 
2f120 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64  =  Total payload
2f130 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b 20 6f   size (local + o
2f140 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20 61 52  verflow).**   aR
2f150 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65 61 64  esult[7] =  Head
2f160 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  er size in bytes
2f170 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 38 5d  .**   aResult[8]
2f180 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c 6f 61   =  Local payloa
2f190 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52 65 73  d size.**   aRes
2f1a0 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65 6e 74  ult[9] =  Parent
2f1b0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
2f1c0 20 20 61 52 65 73 75 6c 74 5b 31 30 5d 3d 20 20    aResult[10]=  
2f1d0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
2f1e0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
2f1f0 77 20 70 61 67 65 0a 2a 2a 0a 2a 2a 20 54 68 69  w page.**.** Thi
2f200 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2f210 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
2f220 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2f230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2f240 42 74 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28  BtreeCursorInfo(
2f250 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2f260 69 6e 74 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e  int *aResult, in
2f270 74 20 75 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20  t upCnt){.  int 
2f280 63 6e 74 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50  cnt, idx;.  MemP
2f290 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2f2a0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 42 74 43 75  r->pPage;.  BtCu
2f2b0 72 73 6f 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20  rsor tmpCur;..  
2f2c0 69 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65  int rc = restore
2f2d0 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2f2e0 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a  ition(pCur, 1);.
2f2f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f300 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
2f310 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
2f320 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2f330 69 74 20 29 3b 0a 20 20 67 65 74 54 65 6d 70 43  it );.  getTempC
2f340 75 72 73 6f 72 28 70 43 75 72 2c 20 26 74 6d 70  ursor(pCur, &tmp
2f350 43 75 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 75  Cur);.  while( u
2f360 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f  pCnt-- ){.    mo
2f370 76 65 54 6f 50 61 72 65 6e 74 28 26 74 6d 70 43  veToParent(&tmpC
2f380 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ur);.  }.  pPage
2f390 20 3d 20 74 6d 70 43 75 72 2e 70 50 61 67 65 3b   = tmpCur.pPage;
2f3a0 0a 20 20 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20  .  aResult[0] = 
2f3b0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2f3c0 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
2f3d0 62 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  bPage);.  assert
2f3e0 28 20 61 52 65 73 75 6c 74 5b 30 5d 3d 3d 70 50  ( aResult[0]==pP
2f3f0 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
2f400 52 65 73 75 6c 74 5b 31 5d 20 3d 20 74 6d 70 43  Result[1] = tmpC
2f410 75 72 2e 69 64 78 3b 0a 20 20 61 52 65 73 75 6c  ur.idx;.  aResul
2f420 74 5b 32 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  t[2] = pPage->nC
2f430 65 6c 6c 3b 0a 20 20 69 66 28 20 74 6d 70 43 75  ell;.  if( tmpCu
2f440 72 2e 69 64 78 3e 3d 30 20 26 26 20 74 6d 70 43  r.idx>=0 && tmpC
2f450 75 72 2e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  ur.idx<pPage->nC
2f460 65 6c 6c 20 29 7b 0a 20 20 20 20 67 65 74 43 65  ell ){.    getCe
2f470 6c 6c 49 6e 66 6f 28 26 74 6d 70 43 75 72 29 3b  llInfo(&tmpCur);
2f480 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20  .    aResult[3] 
2f490 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 53  = tmpCur.info.nS
2f4a0 69 7a 65 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  ize;.    aResult
2f4b0 5b 36 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [6] = tmpCur.inf
2f4c0 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 61 52 65  o.nData;.    aRe
2f4d0 73 75 6c 74 5b 37 5d 20 3d 20 74 6d 70 43 75 72  sult[7] = tmpCur
2f4e0 2e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  .info.nHeader;. 
2f4f0 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20     aResult[8] = 
2f500 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 4c 6f 63  tmpCur.info.nLoc
2f510 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
2f520 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 30 3b   aResult[3] = 0;
2f530 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20  .    aResult[6] 
2f540 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  = 0;.    aResult
2f550 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65  [7] = 0;.    aRe
2f560 73 75 6c 74 5b 38 5d 20 3d 20 30 3b 0a 20 20 7d  sult[8] = 0;.  }
2f570 0a 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20  .  aResult[4] = 
2f580 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b 0a 20 20  pPage->nFree;.  
2f590 63 6e 74 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d  cnt = 0;.  idx =
2f5a0 20 67 65 74 32 62 79 74 65 28 26 70 50 61 67 65   get2byte(&pPage
2f5b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2f5c0 64 72 4f 66 66 73 65 74 2b 31 5d 29 3b 0a 20 20  drOffset+1]);.  
2f5d0 77 68 69 6c 65 28 20 69 64 78 3e 30 20 26 26 20  while( idx>0 && 
2f5e0 69 64 78 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e  idx<pPage->pBt->
2f5f0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
2f600 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 64 78    cnt++;.    idx
2f610 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50 61   = get2byte(&pPa
2f620 67 65 2d 3e 61 44 61 74 61 5b 69 64 78 5d 29 3b  ge->aData[idx]);
2f630 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 35  .  }.  aResult[5
2f640 5d 20 3d 20 63 6e 74 3b 0a 20 20 69 66 28 20 70  ] = cnt;.  if( p
2f650 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
2f660 20 7c 7c 20 69 73 52 6f 6f 74 50 61 67 65 28 70   || isRootPage(p
2f670 50 61 67 65 29 20 29 7b 0a 20 20 20 20 61 52 65  Page) ){.    aRe
2f680 73 75 6c 74 5b 39 5d 20 3d 20 30 3b 0a 20 20 7d  sult[9] = 0;.  }
2f690 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c  else{.    aResul
2f6a0 74 5b 39 5d 20 3d 20 70 50 61 67 65 2d 3e 70 50  t[9] = pPage->pP
2f6b0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  arent->pgno;.  }
2f6c0 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69 6e  .  if( tmpCur.in
2f6d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
2f6e0 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d 20      aResult[10] 
2f6f0 3d 20 67 65 74 34 62 79 74 65 28 26 74 6d 70 43  = get4byte(&tmpC
2f700 75 72 2e 69 6e 66 6f 2e 70 43 65 6c 6c 5b 74 6d  ur.info.pCell[tm
2f710 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76 65 72 66  pCur.info.iOverf
2f720 6c 6f 77 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  low]);.  }else{.
2f730 20 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d 20      aResult[10] 
2f740 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
2f750 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 74 6d  seTempCursor(&tm
2f760 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
2f770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
2f780 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
2f790 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f  n the pager asso
2f7a0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54  ciated with a BT
2f7b0 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ree.  This routi
2f7c0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  ne is used for.*
2f7d0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2f7e0 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2f7f0 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42  .Pager *sqlite3B
2f800 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20  treePager(Btree 
2f810 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
2f820 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a  >pBt->pPager;.}.
2f830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75  ./*.** This stru
2f840 63 74 75 72 65 20 69 73 20 70 61 73 73 65 64 20  cture is passed 
2f850 61 72 6f 75 6e 64 20 74 68 72 6f 75 67 68 20 61  around through a
2f860 6c 6c 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  ll the sanity ch
2f870 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e 65 73 0a  ecking routines.
2f880 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  ** in order to k
2f890 65 65 70 20 74 72 61 63 6b 20 6f 66 20 73 6f 6d  eep track of som
2f8a0 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 69  e global state i
2f8b0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74  nformation..*/.t
2f8c0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e  ypedef struct In
2f8d0 74 65 67 72 69 74 79 43 6b 20 49 6e 74 65 67 72  tegrityCk Integr
2f8e0 69 74 79 43 6b 3b 0a 73 74 72 75 63 74 20 49 6e  ityCk;.struct In
2f8f0 74 65 67 72 69 74 79 43 6b 20 7b 0a 20 20 42 74  tegrityCk {.  Bt
2f900 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2f910 2f 2a 20 54 68 65 20 74 72 65 65 20 62 65 69 6e  /* The tree bein
2f920 67 20 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f  g checked out */
2f930 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2f940 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 6f  ;    /* The asso
2f950 63 69 61 74 65 64 20 70 61 67 65 72 2e 20 20 41  ciated pager.  A
2f960 6c 73 6f 20 61 63 63 65 73 73 69 62 6c 65 20 62  lso accessible b
2f970 79 20 70 42 74 2d 3e 70 50 61 67 65 72 20 2a 2f  y pBt->pPager */
2f980 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2f990 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f9a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
2f9b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
2f9c0 20 2a 61 6e 52 65 66 3b 20 20 20 20 20 20 20 2f   *anRef;       /
2f9d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
2f9e0 73 20 65 61 63 68 20 70 61 67 65 20 69 73 20 72  s each page is r
2f9f0 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69  eferenced */.  i
2fa00 6e 74 20 6d 78 45 72 72 3b 20 20 20 20 20 20 20  nt mxErr;       
2fa10 20 2f 2a 20 53 74 6f 70 20 61 63 63 75 6d 75 6c   /* Stop accumul
2fa20 61 74 69 6e 67 20 65 72 72 6f 72 73 20 77 68 65  ating errors whe
2fa30 6e 20 74 68 69 73 20 72 65 61 63 68 65 73 20 7a  n this reaches z
2fa40 65 72 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ero */.  char *z
2fa50 45 72 72 4d 73 67 3b 20 20 20 20 2f 2a 20 41 6e  ErrMsg;    /* An
2fa60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
2fa70 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 65 72 72 6f   NULL if no erro
2fa80 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 20 20 69 6e  rs seen. */.  in
2fa90 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
2faa0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 73  /* Number of mes
2fab0 73 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  sages written to
2fac0 20 7a 45 72 72 4d 73 67 20 73 6f 20 66 61 72 20   zErrMsg so far 
2fad0 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53  */.};..#ifndef S
2fae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2faf0 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
2fb00 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67   Append a messag
2fb10 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  e to the error m
2fb20 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a  essage string..*
2fb30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
2fb40 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20  eckAppendMsg(.  
2fb50 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
2fb60 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73  eck,.  char *zMs
2fb70 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g1,.  const char
2fb80 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e   *zFormat,.  ...
2fb90 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2fba0 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 32 3b  ;.  char *zMsg2;
2fbb0 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e  .  if( !pCheck->
2fbc0 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  mxErr ) return;.
2fbd0 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d    pCheck->mxErr-
2fbe0 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72  -;.  pCheck->nEr
2fbf0 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  r++;.  va_start(
2fc00 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
2fc10 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65 33 56  zMsg2 = sqlite3V
2fc20 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  MPrintf(zFormat,
2fc30 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
2fc40 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d  p);.  if( zMsg1=
2fc50 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b  =0 ) zMsg1 = "";
2fc60 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a  .  if( pCheck->z
2fc70 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68  ErrMsg ){.    ch
2fc80 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63  ar *zOld = pChec
2fc90 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20  k->zErrMsg;.    
2fca0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20  pCheck->zErrMsg 
2fcb0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2fcc0 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63  SetString(&pChec
2fcd0 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64  k->zErrMsg, zOld
2fce0 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a  , "\n", zMsg1, z
2fcf0 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b  Msg2, (char*)0);
2fd00 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2fd10 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOld);.  }else{.
2fd20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
2fd30 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45  ring(&pCheck->zE
2fd40 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d  rrMsg, zMsg1, zM
2fd50 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sg2, (char*)0);.
2fd60 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
2fd70 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69  (zMsg2);.}.#endi
2fd80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2fd90 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2fda0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2fdb0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2fdc0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
2fdd0 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65  dd 1 to the refe
2fde0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
2fdf0 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20  page iPage.  If 
2fe00 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
2fe10 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  nd.** reference 
2fe20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64  to the page, add
2fe30 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2fe40 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72  e to pCheck->zEr
2fe50 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  rMsg..** Return 
2fe60 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32  1 if there are 2
2fe70 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65   ore more refere
2fe80 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2fe90 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20   and 0 if.** if 
2fea0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
2feb0 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  t reference to t
2fec0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  he page..**.** A
2fed0 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74  lso check that t
2fee0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
2fef0 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a  s in bounds..*/.
2ff00 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2ff10 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20  Ref(IntegrityCk 
2ff20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61  *pCheck, int iPa
2ff30 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  ge, char *zConte
2ff40 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65  xt){.  if( iPage
2ff50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2ff60 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65    if( iPage>pChe
2ff70 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61  ck->nPage || iPa
2ff80 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63  ge<0 ){.    chec
2ff90 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
2ffa0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e  k, zContext, "in
2ffb0 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
2ffc0 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  r %d", iPage);. 
2ffd0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2ffe0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61  .  if( pCheck->a
2fff0 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29  nRef[iPage]==1 )
30000 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
30010 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30020 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65  ntext, "2nd refe
30030 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64  rence to page %d
30040 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72  ", iPage);.    r
30050 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
30060 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e  eturn  (pCheck->
30070 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e  anRef[iPage]++)>
30080 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
30090 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
300a0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  CUUM./*.** Check
300b0 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
300c0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
300d0 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69  ap for page iChi
300e0 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70  ld maps to .** p
300f0 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69  age iParent, poi
30100 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70  nter type ptrTyp
30110 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e  e. If not, appen
30120 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
30130 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e  ge.** to pCheck.
30140 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30150 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49  checkPtrmap(.  I
30160 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
30170 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69  ck,   /* Integri
30180 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74  ty check context
30190 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
301a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
301b0 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65  Child page numbe
301c0 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  r */.  u8 eType,
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
301e0 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65   Expected pointe
301f0 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20  r map type */.  
30200 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20  Pgno iParent,   
30210 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
30220 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ed pointer map p
30230 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
30240 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  r */.  char *zCo
30250 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a  ntext         /*
30260 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70   Context descrip
30270 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65  tion (used for e
30280 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a  rror msg) */.){.
30290 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65    int rc;.  u8 e
302a0 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67  PtrmapType;.  Pg
302b0 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  no iPtrmapParent
302c0 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70  ;..  rc = ptrmap
302d0 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c  Get(pCheck->pBt,
302e0 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61   iChild, &ePtrma
302f0 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50  pType, &iPtrmapP
30300 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
30310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30320 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
30330 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
30340 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72  xt, "Failed to r
30350 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25  ead ptrmap key=%
30360 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  d", iChild);.   
30370 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
30380 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21  if( ePtrmapType!
30390 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61  =eType || iPtrma
303a0 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74  pParent!=iParent
303b0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
303c0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
303d0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
303e0 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74  "Bad ptr map ent
303f0 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74  ry key=%d expect
30400 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28  ed=(%d,%d) got=(
30410 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20  %d,%d)", .      
30420 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69  iChild, eType, i
30430 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54  Parent, ePtrmapT
30440 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65  ype, iPtrmapPare
30450 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  nt);.  }.}.#endi
30460 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  f../*.** Check t
30470 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
30480 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20  the freelist or 
30490 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
304a0 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72  age list..** Ver
304b0 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
304c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
304d0 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a  the list is N..*
304e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
304f0 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67  eckList(.  Integ
30500 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
30510 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
30520 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  ecking context *
30530 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69  /.  int isFreeLi
30540 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  st,       /* Tru
30550 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74  e for a freelist
30560 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65  .  False for ove
30570 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20  rflow page list 
30580 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20  */.  int iPage, 
30590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
305a0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69  ge number for fi
305b0 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  rst page in the 
305c0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c  list */.  int N,
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305e0 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62  /* Expected numb
305f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
30600 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  he list */.  cha
30610 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
30620 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f     /* Context fo
30630 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
30640 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
30650 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d    int expected =
30660 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74   N;.  int iFirst
30670 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c   = iPage;.  whil
30680 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43  e( N-- > 0 && pC
30690 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20  heck->mxErr ){. 
306a0 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c     DbPage *pOvfl
306b0 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Page;.    unsign
306c0 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61  ed char *pOvflDa
306d0 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67  ta;.    if( iPag
306e0 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  e<1 ){.      che
306f0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30700 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
30710 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64         "%d of %d
30720 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66   pages missing f
30730 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  rom overflow lis
30740 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64  t starting at %d
30750 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31  ",.          N+1
30760 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72  , expected, iFir
30770 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
30780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30790 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
307a0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
307b0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  ) ) break;.    i
307c0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  f( sqlite3PagerG
307d0 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65  et(pCheck->pPage
307e0 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  r, (Pgno)iPage, 
307f0 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20  &pOvflPage) ){. 
30800 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30810 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30820 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f  text, "failed to
30830 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69   get page %d", i
30840 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Page);.      bre
30850 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  ak;.    }.    pO
30860 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67  vflData = (unsig
30870 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
30880 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
30890 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69  OvflPage);.    i
308a0 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b  f( isFreeList ){
308b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67  .      int n = g
308c0 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61  et4byte(&pOvflDa
308d0 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20  ta[4]);.#ifndef 
308e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
308f0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
30900 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
30910 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
30920 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
30930 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50  pCheck, iPage, P
30940 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
30950 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  0, zContext);.  
30960 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30970 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d     if( n>pCheck-
30980 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
30990 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20  /4-8 ){.        
309a0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
309b0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
309c0 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65  .           "fre
309d0 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74  elist leaf count
309e0 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65   too big on page
309f0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
30a00 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20        N--;.     
30a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
30a30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67  +){.          Pg
30a40 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67  no iFreePage = g
30a50 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61  et4byte(&pOvflDa
30a60 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e  ta[8+i*4]);.#ifn
30a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30a80 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
30a90 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
30aa0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
30ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30ac0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
30ad0 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50  ck, iFreePage, P
30ae0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
30af0 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  0, zContext);.  
30b00 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
30b10 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
30b20 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65  Ref(pCheck, iFre
30b30 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  ePage, zContext)
30b40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30b50 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20      N -= n;.    
30b60 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
30b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30b80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73  TOVACUUM.    els
30b90 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
30ba0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70  his database sup
30bb0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
30bc0 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e  m and iPage is n
30bd0 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  ot the last.    
30be0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
30bf0 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c  s overflow list,
30c00 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
30c10 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
30c20 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  y for.      ** t
30c30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67  he following pag
30c40 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e  e matches iPage.
30c50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
30c60 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
30c70 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e  >autoVacuum && N
30c80 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  >0 ){.        i 
30c90 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
30ca0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63  Data);.        c
30cb0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
30cc0 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45  k, i, PTRMAP_OVE
30cd0 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a  RFLOW2, iPage, z
30ce0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
30cf0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
30d00 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
30d10 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
30d20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30d30 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29  Unref(pOvflPage)
30d40 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
30d50 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
30d60 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
30d70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30d80 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
30d90 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76  CHECK./*.** Do v
30da0 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68  arious sanity ch
30db0 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  ecks on a single
30dc0 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e   page of a tree.
30dd0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
30de0 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f  tree depth.  Roo
30df0 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30  t pages return 0
30e00 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f  .  Parents of ro
30e10 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75  ot pages.** retu
30e20 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  rn 1, and so for
30e30 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65  th..** .** These
30e40 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65   checks are done
30e50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20  :.**.**      1. 
30e60 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
30e70 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c  cells and freebl
30e80 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72  ocks do not over
30e90 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  lap.**          
30ea0 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63  but combine to c
30eb0 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20  ompletely cover 
30ec0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f  the page..**  NO
30ed0 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    2.  Make sure 
30ee0 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e  cell keys are in
30ef0 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20   order..**  NO  
30f00 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  3.  Make sure no
30f10 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61   key is less tha
30f20 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c  n or equal to zL
30f30 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e  owerBound..**  N
30f40 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  4.  Make sure
30f50 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74   no key is great
30f60 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
30f70 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e   to zUpperBound.
30f80 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65  .**      5.  Che
30f90 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
30fa0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
30fb0 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20  es..**      6.  
30fc0 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c  Recursively call
30fd0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f   checkTreePage o
30fe0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a  n all children..
30ff0 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69  **      7.  Veri
31000 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74  fy that the dept
31010 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65  h of all childre
31020 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a  n is the same..*
31030 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20  *      8.  Make 
31040 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69  sure this page i
31050 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66  s at least 33% f
31060 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69  ull or else it i
31070 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  s.**          th
31080 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  e root of the tr
31090 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
310a0 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  t checkTreePage(
310b0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
310c0 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74  pCheck,  /* Cont
310d0 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69  ext for the sani
310e0 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  ty check */.  in
310f0 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
31100 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
31110 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
31120 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d  o check */.  Mem
31130 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
31140 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
31150 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  e */.  char *zPa
31160 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20  rentContext  /* 
31170 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a  Parent context *
31180 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
31190 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pPage;.  int i, 
311a0 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70  rc, depth, d2, p
311b0 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20  gno, cnt;.  int 
311c0 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a  hdr, cellStart;.
311d0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75    int nCell;.  u
311e0 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61  8 *data;.  BtSha
311f0 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  red *pBt;.  int 
31200 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68  usableSize;.  ch
31210 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d  ar zContext[100]
31220 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a  ;.  char *hit;..
31230 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65    sprintf(zConte
31240 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c  xt, "Page %d: ",
31250 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43   iPage);..  /* C
31260 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
31270 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20  ge exists.  */. 
31280 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70   pBt = pCheck->p
31290 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  Bt;.  usableSize
312a0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
312b0 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  ze;.  if( iPage=
312c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
312d0 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
312e0 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61  heck, iPage, zPa
312f0 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72  rentContext) ) r
31300 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
31310 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
31320 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
31330 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
31340 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31350 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31360 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
31370 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
31380 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
31390 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
313a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
313b0 66 28 20 28 72 63 20 3d 20 69 6e 69 74 50 61 67  f( (rc = initPag
313c0 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
313d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
313e0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
313f0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
31400 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72 6e  nitPage() return
31410 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22  s error code %d"
31420 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61  , rc);.    relea
31430 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
31440 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
31450 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74  ..  /* Check out
31460 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a   all the cells..
31470 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30    */.  depth = 0
31480 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
31490 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70  Page->nCell && p
314a0 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b  Check->mxErr; i+
314b0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
314c0 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  l;.    int sz;. 
314d0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
314e0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
314f0 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77  payload overflow
31500 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20   pages.    */.  
31510 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65    sprintf(zConte
31520 78 74 2c 20 22 4f 6e 20 74 72 65 65 20 70 61 67  xt, "On tree pag
31530 65 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c  e %d cell %d: ",
31540 20 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   iPage, i);.    
31550 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
31560 28 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 70  (pPage,i);.    p
31570 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
31580 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
31590 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
315a0 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
315b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
315c0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
315d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d  .    assert( sz=
315e0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
315f0 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66  ;.    if( sz>inf
31600 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
31610 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73    int nPage = (s
31620 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  z - info.nLocal 
31630 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35  + usableSize - 5
31640 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  )/(usableSize - 
31650 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  4);.      Pgno p
31660 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
31670 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
31680 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e  Overflow]);.#ifn
31690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
316a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
316b0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
316c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
316d0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
316e0 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  ck, pgnoOvfl, PT
316f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
31700 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
31710 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
31720 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74  .      checkList
31730 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f  (pCheck, 0, pgno
31740 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f  Ovfl, nPage, zCo
31750 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
31760 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69     /* Check sani
31770 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64  ty of left child
31780 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
31790 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
317a0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  af ){.      pgno
317b0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
317c0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
317d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
317e0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
317f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
31800 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
31810 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
31820 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
31830 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
31840 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
31850 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63  .      d2 = chec
31860 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
31870 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e  ,pgno,pPage,zCon
31880 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  text);.      if(
31890 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74   i>0 && d2!=dept
318a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  h ){.        che
318b0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
318c0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43  ck, zContext, "C
318d0 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20  hild page depth 
318e0 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20  differs");.     
318f0 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d   }.      depth =
31900 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   d2;.    }.  }. 
31910 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
31920 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
31930 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
31940 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
31950 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
31960 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78   sprintf(zContex
31970 74 2c 20 22 4f 6e 20 70 61 67 65 20 25 64 20 61  t, "On page %d a
31980 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20 22  t right child: "
31990 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65  , iPage);.#ifnde
319a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
319b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
319c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
319d0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50   ){.      checkP
319e0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
319f0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
31a00 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  , iPage, 0);.   
31a10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
31a20 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65  eckTreePage(pChe
31a30 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 2c  ck, pgno, pPage,
31a40 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a   zContext);.  }.
31a50 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72   .  /* Check for
31a60 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72 61   complete covera
31a70 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  ge of the page. 
31a80 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50 61   */.  data = pPa
31a90 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
31aa0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
31ab0 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71 6c  set;.  hit = sql
31ac0 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61 62 6c  iteMalloc( usabl
31ad0 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68  eSize );.  if( h
31ae0 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  it ){.    memset
31af0 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74  (hit, 1, get2byt
31b00 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29  e(&data[hdr+5]))
31b10 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65  ;.    nCell = ge
31b20 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
31b30 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74  +3]);.    cellSt
31b40 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  art = hdr + 12 -
31b50 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
31b60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
31b70 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
31b80 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62    int pc = get2b
31b90 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74  yte(&data[cellSt
31ba0 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  art+i*2]);.     
31bb0 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65 6c 6c   int size = cell
31bc0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
31bd0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
31be0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
31bf0 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75  ( (pc+size-1)>=u
31c00 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c  sableSize || pc<
31c10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  0 ){.        che
31c20 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31c30 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
31c40 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20      "Corruption 
31c50 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c  detected in cell
31c60 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
31c70 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20  i,iPage,0);.    
31c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31c90 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31   for(j=pc+size-1
31ca0 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69  ; j>=pc; j--) hi
31cb0 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
31cc0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e      }.    for(cn
31cd0 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28  t=0, i=get2byte(
31ce0 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69  &data[hdr+1]); i
31cf0 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69  >0 && i<usableSi
31d00 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b  ze && cnt<10000;
31d10 20 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e 74   .           cnt
31d20 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  ++){.      int s
31d30 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
31d40 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20  data[i+2]);.    
31d50 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
31d60 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75  f( (i+size-1)>=u
31d70 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30  sableSize || i<0
31d80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
31d90 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31da0 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20  k, 0,  .        
31db0 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20      "Corruption 
31dc0 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c  detected in cell
31dd0 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
31de0 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20  i,iPage,0);.    
31df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31e00 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b   for(j=i+size-1;
31e10 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b   j>=i; j--) hit[
31e20 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j]++;.      }.  
31e30 20 20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65      i = get2byte
31e40 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20  (&data[i]);.    
31e50 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d  }.    for(i=cnt=
31e60 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b  0; i<usableSize;
31e70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
31e80 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20   hit[i]==0 ){.  
31e90 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
31ea0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74     }else if( hit
31eb0 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  [i]>1 ){.       
31ec0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31ed0 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20  pCheck, 0,.     
31ee0 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75       "Multiple u
31ef0 73 65 73 20 66 6f 72 20 62 79 74 65 20 25 64 20  ses for byte %d 
31f00 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20  of page %d", i, 
31f10 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
31f20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
31f30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74     }.    if( cnt
31f40 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b  !=data[hdr+7] ){
31f50 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
31f60 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
31f70 20 0a 20 20 20 20 20 20 20 20 20 20 22 46 72 61   .          "Fra
31f80 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73  gmented space is
31f90 20 25 64 20 62 79 74 65 20 72 65 70 6f 72 74 65   %d byte reporte
31fa0 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20  d as %d on page 
31fb0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63  %d",.          c
31fc0 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c  nt, data[hdr+7],
31fd0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20   iPage);.    }. 
31fe0 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
31ff0 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  hit);..  release
32000 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
32010 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d  eturn depth+1;.}
32020 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32030 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
32040 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
32050 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
32060 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
32070 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
32080 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74  e does a complet
32090 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67  e check of the g
320a0 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e  iven BTree file.
320b0 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20    aRoot[] is.** 
320c0 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61 67 65  an array of page
320d0 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65  s numbers were e
320e0 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ach page number 
320f0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
32100 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20   of.** a table. 
32110 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75   nRoot is the nu
32120 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
32130 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  in aRoot..**.** 
32140 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 63 68  If everything ch
32150 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72  ecks out, this r
32160 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
32170 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69  ULL.  If somethi
32180 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20  ng is.** amiss, 
32190 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
321a0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
321b0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
321c0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a   from malloc().*
321d0 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  * and a pointer 
321e0 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65  to that error me
321f0 73 73 61 67 65 20 69 73 20 72 65 74 75 72 6e 65  ssage is returne
32200 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  d.  The calling 
32210 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
32220 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
32230 72 65 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72  reeing the error
32240 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74   message when it
32250 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61   is done..*/.cha
32260 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49  r *sqlite3BtreeI
32270 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20  ntegrityCheck(. 
32280 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f   Btree *p,     /
32290 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62  * The btree to b
322a0 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69  e checked */.  i
322b0 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20  nt *aRoot,   /* 
322c0 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74  An array of root
322d0 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66   pages numbers f
322e0 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72  or individual tr
322f0 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ees */.  int nRo
32300 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ot,    /* Number
32310 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
32320 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Root[] */.  int 
32330 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f  mxErr,    /* Sto
32340 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f  p reporting erro
32350 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61  rs after this ma
32360 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ny */.  int *pnE
32370 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e  rr    /* Write n
32380 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
32390 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72  seen to this var
323a0 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  iable */.){.  in
323b0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b  t i;.  int nRef;
323c0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73  .  IntegrityCk s
323d0 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65  Check;.  BtShare
323e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
323f0 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  ..  nRef = sqlit
32400 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
32410 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
32420 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  if( lockBtreeWit
32430 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54  hRetry(p)!=SQLIT
32440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
32450 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75 70 28  rn sqliteStrDup(
32460 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69  "Unable to acqui
32470 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  re a read lock o
32480 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29  n the database")
32490 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70  ;.  }.  sCheck.p
324a0 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65  Bt = pBt;.  sChe
324b0 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d  ck.pPager = pBt-
324c0 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63  >pPager;.  sChec
324d0 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65  k.nPage = sqlite
324e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
324f0 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a  sCheck.pPager);.
32500 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d    sCheck.mxErr =
32510 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b   mxErr;.  sCheck
32520 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e  .nErr = 0;.  *pn
32530 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  Err = 0;.  if( s
32540 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29  Check.nPage==0 )
32550 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
32560 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
32570 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
32580 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
32590 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
325a0 61 77 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67  aw( (sCheck.nPag
325b0 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
325c0 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a  ck.anRef[0]) );.
325d0 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e    if( !sCheck.an
325e0 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  Ref ){.    unloc
325f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
32600 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20  Bt);.    *pnErr 
32610 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
32620 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
32630 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63  Unable to malloc
32640 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20   %d bytes", .   
32650 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61       (sCheck.nPa
32660 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68  ge+1)*sizeof(sCh
32670 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a  eck.anRef[0]));.
32680 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
32690 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20  <=sCheck.nPage; 
326a0 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52  i++){ sCheck.anR
326b0 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69  ef[i] = 0; }.  i
326c0 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
326d0 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28  PAGE(pBt);.  if(
326e0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
326f0 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61   ){.    sCheck.a
32700 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  nRef[i] = 1;.  }
32710 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73  .  sCheck.zErrMs
32720 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65  g = 0;..  /* Che
32730 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
32740 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
32750 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73  .  */.  checkLis
32760 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65  t(&sCheck, 1, ge
32770 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
32780 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
32790 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
327a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
327b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20  e1->aData[36]), 
327c0 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20  "Main freelist: 
327d0 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ");..  /* Check 
327e0 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a  all the tables..
327f0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
32800 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63  i<nRoot && sChec
32810 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  k.mxErr; i++){. 
32820 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d     if( aRoot[i]=
32830 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  =0 ) continue;.#
32840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32850 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32860 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
32870 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69  acuum && aRoot[i
32880 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ]>1 ){.      che
32890 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b  ckPtrmap(&sCheck
328a0 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d  , aRoot[i], PTRM
328b0 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
328c0 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
328d0 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
328e0 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ge(&sCheck, aRoo
328f0 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f  t[i], 0, "List o
32900 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29  f tree roots: ")
32910 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
32920 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65   sure every page
32930 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
32940 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a  referenced.  */.
32950 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43    for(i=1; i<=sC
32960 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43  heck.nPage && sC
32970 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29  heck.mxErr; i++)
32980 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
32990 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
329a0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
329b0 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  nRef[i]==0 ){.  
329c0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
329d0 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
329e0 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
329f0 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
32a00 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49  }.#else.    /* I
32a10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
32a20 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
32a30 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e  uum, make sure n
32a40 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e  o tables contain
32a50 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
32a60 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61  es to pointer-ma
32a70 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a  p pages..    */.
32a80 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
32a90 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20  nRef[i]==0 && . 
32aa0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
32ab0 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20  GENO(pBt, i)!=i 
32ac0 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  || !pBt->autoVac
32ad0 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
32ae0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
32af0 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
32b00 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
32b10 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
32b20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
32b30 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20  [i]!=0 && .     
32b40 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f    (PTRMAP_PAGENO
32b50 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70  (pBt, i)==i && p
32b60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
32b70 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32b80 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32b90 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70   0, "Pointer map
32ba0 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65   page %d is refe
32bb0 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20  renced", i);.   
32bc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
32bd0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
32be0 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20  is analysis did 
32bf0 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e  not leave any un
32c00 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f  ref() pages.  */
32c10 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
32c20 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69  Unused(pBt);.  i
32c30 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74  f( nRef != sqlit
32c40 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
32c50 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
32c60 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32c70 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a  sg(&sCheck, 0, .
32c80 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69        "Outstandi
32c90 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f  ng page count go
32ca0 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  es from %d to %d
32cb0 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61   during this ana
32cc0 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52  lysis",.      nR
32cd0 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ef, sqlite3Pager
32ce0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
32cf0 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d  ager).    );.  }
32d00 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70  ..  /* Clean  up
32d10 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f   and report erro
32d20 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  rs..  */.  sqlit
32d30 65 46 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52  eFree(sCheck.anR
32d40 65 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  ef);.  *pnErr = 
32d50 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72  sCheck.nErr;.  r
32d60 65 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72  eturn sCheck.zEr
32d70 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rMsg;.}.#endif /
32d80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
32d90 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
32da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
32db0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
32dc0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
32dd0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
32de0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
32df0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
32e00 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a  Filename(Btree *
32e10 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
32e20 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
32e30 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
32e40 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
32e50 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
32e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
32e70 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
32e80 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
32e90 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
32ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32eb0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
32ec0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44  sqlite3BtreeGetD
32ed0 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  irname(Btree *p)
32ee0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
32ef0 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
32f00 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
32f10 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d  3PagerDirname(p-
32f20 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  >pBt->pPager);.}
32f30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
32f40 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  he pathname of t
32f50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32f60 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
32f70 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a  e. The return.**
32f80 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72   value of this r
32f90 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61  outine is the sa
32fa0 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  me regardless of
32fb0 20 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75   whether the jou
32fc0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73  rnal file.** has
32fd0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72   been created or
32fe0 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63   not..*/.const c
32ff0 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
33000 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
33010 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33020 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33030 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
33040 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  rn sqlite3PagerJ
33050 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42  ournalname(p->pB
33060 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23  t->pPager);.}..#
33070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33080 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
33090 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
330a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74  e content of pBt
330b0 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e  From into pBtTo.
330c0 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a    A transaction.
330d0 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  ** must be activ
330e0 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73  e for both files
330f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ..**.** The size
33100 20 6f 66 20 66 69 6c 65 20 70 42 74 46 72 6f 6d   of file pBtFrom
33110 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20   may be reduced 
33120 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
33130 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  n..** If anythin
33140 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68  g goes wrong, th
33150 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e transaction on
33160 20 70 42 74 46 72 6f 6d 20 69 73 20 72 6f 6c 6c   pBtFrom is roll
33170 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ed back..*/.int 
33180 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79  sqlite3BtreeCopy
33190 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c  File(Btree *pTo,
331a0 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a   Btree *pFrom){.
331b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
331c0 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20  E_OK;.  Pgno i, 
331d0 6e 50 61 67 65 2c 20 6e 54 6f 50 61 67 65 2c 20  nPage, nToPage, 
331e0 69 53 6b 69 70 3b 0a 0a 20 20 42 74 53 68 61 72  iSkip;..  BtShar
331f0 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d  ed *pBtTo = pTo-
33200 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64  >pBt;.  BtShared
33210 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f   *pBtFrom = pFro
33220 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70  m->pBt;..  if( p
33230 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  To->inTrans!=TRA
33240 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f  NS_WRITE || pFro
33250 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  m->inTrans!=TRAN
33260 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
33270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
33280 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42  OR;.  }.  if( pB
33290 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 20 72  tTo->pCursor ) r
332a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
332b0 59 3b 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 73  Y;.  nToPage = s
332c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
332d0 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  ount(pBtTo->pPag
332e0 65 72 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  er);.  nPage = s
332f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
33300 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  ount(pBtFrom->pP
33310 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d  ager);.  iSkip =
33320 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
33330 47 45 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72  GE(pBtTo);.  for
33340 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
33350 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b  _OK && i<=nPage;
33360 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67   i++){.    DbPag
33370 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
33380 69 66 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63  if( i==iSkip ) c
33390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20  ontinue;.    rc 
333a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
333b0 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
333c0 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b  r, i, &pDbPage);
333d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
333e0 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  eak;.    rc = sq
333f0 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72  lite3PagerOverwr
33400 69 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ite(pBtTo->pPage
33410 72 2c 20 69 2c 20 73 71 6c 69 74 65 33 50 61 67  r, i, sqlite3Pag
33420 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
33430 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e));.    sqlite3
33440 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
33450 67 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ge);.  }.  for(i
33460 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51  =nPage+1; rc==SQ
33470 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54  LITE_OK && i<=nT
33480 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  oPage; i++){.   
33490 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
334a0 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b  ;.    if( i==iSk
334b0 69 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ip ) continue;. 
334c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
334d0 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
334e0 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
334f0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
33500 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
33510 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33520 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
33530 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33540 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
33550 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
33560 6e 74 57 72 69 74 65 28 70 42 74 54 6f 2d 3e 70  ntWrite(pBtTo->p
33570 50 61 67 65 72 2c 20 69 29 3b 0a 20 20 7d 0a 20  Pager, i);.  }. 
33580 20 69 66 28 20 21 72 63 20 26 26 20 6e 50 61 67   if( !rc && nPag
33590 65 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20  e<nToPage ){.   
335a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
335b0 65 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f  erTruncate(pBtTo
335c0 2d 3e 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29  ->pPager, nPage)
335d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
335e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
335f0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b  eeRollback(pTo);
33600 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
33610 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
33620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
33630 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
33640 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
33650 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
33660 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
33670 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
33680 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
33690 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
336a0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
336b0 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f  NS_WRITE));.}../
336c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
336d0 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d  zero if a statem
336e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
336f0 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
33700 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
33710 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  InStmt(Btree *p)
33720 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  {.  return (p->p
33730 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e  Bt && p->pBt->in
33740 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
33750 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
33760 69 66 20 61 20 72 65 61 64 20 28 6f 72 20 77 72  if a read (or wr
33770 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
33780 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
33790 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
337a0 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72  sInReadTrans(Btr
337b0 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
337c0 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
337d0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
337e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
337f0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
33800 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
33810 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
33820 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
33830 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
33840 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
33850 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
33860 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
33870 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
33880 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
33890 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
338a0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
338b0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
338c0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
338d0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
338e0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
338f0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
33900 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
33910 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
33920 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
33930 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
33940 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
33950 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
33960 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
33970 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
33980 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
33990 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
339a0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
339b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
339c0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
339d0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
339e0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
339f0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
33a00 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
33a10 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
33a20 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
33a30 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
33a40 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
33a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
33a60 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
33a70 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
33a80 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72  treeCommit() for
33a90 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
33aa0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
33ab0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
33ac0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
33ad0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
33ae0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
33af0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
33b00 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
33b10 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
33b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33b30 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
33b40 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
33b50 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
33b60 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
33b70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
33b80 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
33b90 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
33ba0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
33bb0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
33bc0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
33bd0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
33be0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
33bf0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
33c00 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
33c10 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
33c20 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
33c30 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
33c40 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
33c50 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
33c60 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
33c70 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
33c80 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
33c90 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
33ca0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
33cb0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
33cc0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
33cd0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
33ce0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
33cf0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
33d00 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
33d10 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
33d20 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
33d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
33d40 63 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  c(Btree *p, cons
33d50 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
33d60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33d70 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
33d80 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
33d90 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
33da0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
33db0 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54  pBt;.    Pgno nT
33dc0 72 75 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  runc = 0;.#ifnde
33dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
33de0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
33df0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
33e00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
33e10 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
33e20 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a  pBt, &nTrunc); .
33e30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33e40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33e50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
33e70 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
33e80 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 42 74  te3PagerSync(pBt
33e90 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
33ea0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
33eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33ec0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
33ed0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
33ee0 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20  inter to a blob 
33ef0 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
33f00 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73  ated with.** a s
33f10 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72  ingle shared-btr
33f20 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69  ee. The memory i
33f30 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74  s used by client
33f40 20 63 6f 64 65 20 66 6f 72 20 69 74 27 73 20 6f   code for it's o
33f50 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
33f60 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
33f70 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
33f80 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
33f90 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
33fa0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
33fb0 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
33fc0 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
33fd0 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
33fe0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
33ff0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
34000 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
34010 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
34020 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
34030 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
34040 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
34050 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
34060 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
34070 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
34080 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
34090 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
340a0 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
340b0 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
340c0 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
340d0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
340e0 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  * Just before th
340f0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69  e shared-btree i
34100 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75  s closed, the fu
34110 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73  nction passed as
34120 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61   the .** xFree a
34130 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65  rgument when the
34140 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
34150 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69  on was made is i
34160 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a  nvoked on the .*
34170 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61  * blob of alloca
34180 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  ted memory. This
34190 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
341a0 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65   not call sqlite
341b0 46 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65  Free().** on the
341c0 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72   memory, the btr
341d0 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68  ee layer does th
341e0 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  at..*/.void *sql
341f0 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
34200 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42  Btree *p, int nB
34210 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65  ytes, void(*xFre
34220 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42  e)(void *)){.  B
34230 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
34240 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 21 70 42  ->pBt;.  if( !pB
34250 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
34260 20 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d    pBt->pSchema =
34270 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42   sqliteMalloc(nB
34280 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ytes);.    pBt->
34290 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46  xFreeSchema = xF
342a0 72 65 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ree;.  }.  retur
342b0 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  n pBt->pSchema;.
342c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
342d0 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20  true if another 
342e0 75 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65  user of the same
342f0 20 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73   shared btree as
34300 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   the argument.**
34310 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e   handle holds an
34320 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
34330 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
34340 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ster table..*/.i
34350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
34360 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65  chemaLocked(Btre
34370 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
34380 28 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28  (queryTableLock(
34390 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
343a0 52 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49  READ_LOCK)!=SQLI
343b0 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  TE_OK);.}...#ifn
343c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
343d0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
343e0 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ** Obtain a lock
343f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68   on the table wh
34400 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ose root page is
34410 20 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c   iTab.  The.** l
34420 6f 63 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c  ock is a write l
34430 6f 63 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f  ock if isWritelo
34440 63 6b 20 69 73 20 74 72 75 65 20 6f 72 20 61 20  ck is true or a 
34450 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20  read lock.** if 
34460 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  it is false..*/.
34470 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34480 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  LockTable(Btree 
34490 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38  *p, int iTab, u8
344a0 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20   isWriteLock){. 
344b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
344c0 5f 4f 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79  _OK;.  u8 lockTy
344d0 70 65 20 3d 20 28 69 73 57 72 69 74 65 4c 6f 63  pe = (isWriteLoc
344e0 6b 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41  k?WRITE_LOCK:REA
344f0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20  D_LOCK);.  rc = 
34500 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
34510 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
34520 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
34530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
34540 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
34550 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  iTab, lockType);
34560 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
34570 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
34580 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
34590 64 65 62 75 67 67 69 6e 67 20 69 6e 74 65 72 66  debugging interf
345a0 61 63 65 20 68 61 73 20 74 6f 20 62 65 20 69 6e  ace has to be in
345b0 20 74 68 69 73 20 66 69 6c 65 20 28 72 61 74 68   this file (rath
345c0 65 72 0a 2a 2a 20 74 68 61 6e 20 69 6e 2c 20 66  er.** than in, f
345d0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 65 73 74  or example, test
345e0 31 2e 63 29 20 73 6f 20 74 68 61 74 20 69 74 20  1.c) so that it 
345f0 63 61 6e 20 67 65 74 20 61 63 63 65 73 73 20 74  can get access t
34600 6f 0a 2a 2a 20 74 68 65 20 64 65 66 69 6e 69 74  o.** the definit
34610 69 6f 6e 20 6f 66 20 42 74 53 68 61 72 65 64 2e  ion of BtShared.
34620 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
34630 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
34640 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 0a   defined(TCLSH).
34650 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e  #include <tcl.h>
34660 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 61  .int sqlite3_sha
34670 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74  red_cache_report
34680 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
34690 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
346a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
346b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
346c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
346d0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
346e0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
346f0 41 43 48 45 0a 20 20 63 6f 6e 73 74 20 54 68 72  ACHE.  const Thr
34700 65 61 64 44 61 74 61 20 2a 70 54 64 20 3d 20 73  eadData *pTd = s
34710 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
34720 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66  ReadOnly();.  if
34730 28 20 70 54 64 2d 3e 75 73 65 53 68 61 72 65 64  ( pTd->useShared
34740 44 61 74 61 20 29 7b 0a 20 20 20 20 42 74 53 68  Data ){.    BtSh
34750 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 20 20 54  ared *pBt;.    T
34760 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54  cl_Obj *pRet = T
34770 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20  cl_NewObj();.   
34780 20 66 6f 72 28 70 42 74 3d 70 54 64 2d 3e 70 42   for(pBt=pTd->pB
34790 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74 3d 70  tree; pBt; pBt=p
347a0 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
347b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
347c0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
347d0 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
347e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 54  pPager);.      T
347f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
34800 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
34810 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
34820 69 6e 67 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31  ingObj(zFile, -1
34830 29 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  ));.      Tcl_Li
34840 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
34850 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
34860 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
34870 42 74 2d 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20  Bt->nRef));.    
34880 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }.    Tcl_SetObj
34890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
348a0 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Ret);.  }.#endif
348b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
348c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.