/ Hex Artifact Content
Login

Artifact 27e62fc50dba2ac0b4210402804ac12321ad8e59:


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 33 20 32 30 30 37 2f 30  c,v 1.343 2007/0
0190: 33 2f 32 37 20 31 34 3a 30 35 3a 32 33 20 64 72  3/27 14:05:23 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 26 70 43 75 72 2d 3e 73 6b 69 70 29  ey, &pCur->skip)
6f30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
6f40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6f50: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
6f60: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
6f70: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
6f80: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6f90: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6fa0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 49 4e  ate || CURSOR_IN
6fb0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6fc0: 61 74 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ate );.  }.  ret
6fd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
6fe0: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
6ff0: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
7000: 70 2c 78 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  p,x) \.  (p->eSt
7010: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate==CURSOR_REQU
7020: 49 52 45 53 45 45 4b 3f 72 65 73 74 6f 72 65 4f  IRESEEK?restoreO
7030: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
7040: 74 69 6f 6e 58 28 70 2c 78 29 3a 53 51 4c 49 54  tionX(p,x):SQLIT
7050: 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53  E_OK)..#ifndef S
7060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
7070: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ACUUM./*.** Thes
7080: 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20  e macros define 
7090: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
70a0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
70b0: 65 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a 20  entry for a .** 
70c0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
70d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
70e0: 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68 65  t to each is the
70f0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   number of usabl
7100: 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65 61  e.** bytes on ea
7110: 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ch page of the d
7120: 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20 31  atabase (often 1
7130: 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  024). The second
7140: 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
7150: 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20 75  number to look u
7160: 70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  p in the pointer
7170: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d   map..**.** PTRM
7180: 41 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72 6e  AP_PAGENO return
7190: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  s the database p
71a0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
71b0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
71c0: 20 70 61 67 65 20 74 68 61 74 20 73 74 6f 72 65   page that store
71d0: 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20 70  s the required p
71e0: 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f 50  ointer. PTRMAP_P
71f0: 54 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e 73  TROFFSET returns
7200: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 6f  .** the offset o
7210: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
7220: 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  map entry..**.**
7230: 20 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72 67   If the pgno arg
7240: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
7250: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69 73  PTRMAP_PAGENO is
7260: 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
7270: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67 6e  age,.** then pgn
7280: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 53  o is returned. S
7290: 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  o (pgno==PTRMAP_
72a0: 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67 6e  PAGENO(pgsz, pgn
72b0: 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75 73  o)) can be.** us
72c0: 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 70 67  ed to test if pg
72d0: 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72 2d  no is a pointer-
72e0: 6d 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41 50  map page. PTRMAP
72f0: 5f 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65 6e  _ISPAGE implemen
7300: 74 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74 2e  ts.** this test.
7310: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d  .*/.#define PTRM
7320: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
7330: 67 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65 6e  gno) ptrmapPagen
7340: 6f 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64 65  o(pBt, pgno).#de
7350: 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52 4f  fine PTRMAP_PTRO
7360: 46 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f 29  FFSET(pBt, pgno)
7370: 20 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61 70   (5*(pgno-ptrmap
7380: 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e 6f  Pageno(pBt, pgno
7390: 29 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50 54  )-1)).#define PT
73a0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
73b0: 20 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f 50   pgno) (PTRMAP_P
73c0: 41 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67 6e  AGENO((pBt),(pgn
73d0: 6f 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73 74  o))==(pgno))..st
73e0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
73f0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
7400: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
7410: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
7420: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7430: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7440: 3b 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70 20  ;.  int iPtrMap 
7450: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
7460: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 69  sPerMapPage;.  i
7470: 6e 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  nt ret = (iPtrMa
7480: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
7490: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
74a0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
74b0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
74c0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
74d0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
74e0: 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
74f0: 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75 70   map is a lookup
7500: 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65 6e   table that iden
7510: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
7520: 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65 61  t page for.** ea
7530: 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ch child page in
7540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7550: 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74 20  le.  The parent 
7560: 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
7570: 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e   that.** contain
7580: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7590: 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72 79  he child.  Every
75a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
75b0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  abase contains.*
75c0: 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74 20  * 0 or 1 parent 
75d0: 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69 73  pages.  (In this
75e0: 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62 61   context 'databa
75f0: 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73 0a  se page' refers.
7600: 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20 74  ** to any page t
7610: 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  hat is not part 
7620: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  of the pointer m
7630: 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61 63  ap itself.)  Eac
7640: 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a  h pointer map.**
7650: 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73 20   entry consists 
7660: 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  of a single byte
7670: 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34 20   'type' and a 4 
7680: 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67 65  byte parent page
7690: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20   number..** The 
76a0: 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e 74  PTRMAP_XXX ident
76b0: 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72 65  ifiers below are
76c0: 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65 73   the valid types
76d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70  ..**.** The purp
76e0: 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ose of the point
76f0: 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61 63  er map is to fac
7700: 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61 67  ility moving pag
7710: 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70  es from one.** p
7720: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 66  osition in the f
7730: 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 61  ile to another a
7740: 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76 61  s part of autova
7750: 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70 61  cuum.  When a pa
7760: 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c 20  ge.** is moved, 
7770: 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 69  the pointer in i
7780: 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  ts parent must b
7790: 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  e updated to poi
77a0: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 77  nt to the.** new
77b0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20   location.  The 
77c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 75  pointer map is u
77d0: 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
77e0: 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71 75  e parent page qu
77f0: 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  ickly..**.** PTR
7800: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54 68  MAP_ROOTPAGE: Th
7810: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7820: 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e 20  is a root-page. 
7830: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
7840: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
7850: 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20             used 
7860: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
7870: 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45 50  .** PTRMAP_FREEP
7880: 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61 73  AGE: The databas
7890: 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e 75  e page is an unu
78a0: 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65 2e  sed (free) page.
78b0: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
78c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
78d0: 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73 65        is not use
78e0: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
78f0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
7900: 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74 61  RFLOW1: The data
7910: 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68 65  base page is the
7920: 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 61   first page in a
7930: 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20 20   list of .**    
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
7950: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
7960: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
7970: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 61  dentifies the pa
7980: 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ge that.**      
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
79a0: 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 77  tains the cell w
79b0: 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ith a pointer to
79c0: 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
79d0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
79e0: 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68 65  P_OVERFLOW2: The
79f0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
7a00: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  s the second or 
7a10: 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61 20  later page in a 
7a20: 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
7a40: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
7a50: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64 65   page-number ide
7a60: 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65 76  ntifies the prev
7a70: 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ious.**         
7a80: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 69            page i
7a90: 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  n the overflow p
7aa0: 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  age list..**.** 
7ab0: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54 68  PTRMAP_BTREE: Th
7ac0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7ad0: 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74  is a non-root bt
7ae0: 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70 61  ree page. The pa
7af0: 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  ge number.**    
7b00: 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74             ident
7b10: 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e 74  ifies the parent
7b20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74 72   page in the btr
7b30: 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ee..*/.#define P
7b40: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 31  TRMAP_ROOTPAGE 1
7b50: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7b60: 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66 69  FREEPAGE 2.#defi
7b70: 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ne PTRMAP_OVERFL
7b80: 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50 54  OW1 3.#define PT
7b90: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 34  RMAP_OVERFLOW2 4
7ba0: 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f  .#define PTRMAP_
7bb0: 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57  BTREE 5../*.** W
7bc0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
7bd0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
7be0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7bf0: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
7c00: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7c10: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
7c20: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
7c30: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
7c40: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
7c50: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
7c60: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
7c70: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
7c80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
7c90: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7ca0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
7cb0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7cc0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
7cd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7ce0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7cf0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
7d00: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7d10: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
7d20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7d30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7d40: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7d50: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
7d60: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7d70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7d80: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
7d90: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
7da0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
7db0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
7dc0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7dd0: 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  rc;..  /* The ma
7de0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7df0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7e00: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
7e10: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7e20: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
7e30: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
7e40: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
7e50: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
7e60: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7e70: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7e80: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7e90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ea0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7eb0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
7ec0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
7ed0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
7ee0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
7ef0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
7f00: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
7f10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7f20: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
7f30: 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65   rc;.  }.  offse
7f40: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7f50: 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a  FSET(pBt, key);.
7f60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7f70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7f80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7f90: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7fa0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7fb0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7fc0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7fd0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7fe0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7ff0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
8000: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
8010: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63  parent));.    rc
8020: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
8030: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
8040: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8050: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
8060: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
8070: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
8080: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
8090: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
80a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
80b0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
80c0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65  f(pDbPage);.  re
80d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
80e0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
80f0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
8100: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
8110: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
8120: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
8130: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
8140: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
8150: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
8160: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
8170: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
8180: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
8190: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
81a0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
81b0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
81c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
81d0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
81e0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
81f0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
8200: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8210: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
8220: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
8230: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
8240: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
8250: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
8260: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
8270: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8280: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
8290: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
82a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
82b0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
82c0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
82d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
82e0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
82f0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
8300: 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20   rc;..  iPtrmap 
8310: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8320: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8330: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8340: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8350: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8360: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8380: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
8390: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
83a0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
83b0: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
83c0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
83d0: 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 61  T(pBt, key);.  a
83e0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
83f0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
8400: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
8410: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
8420: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
8430: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8440: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
8450: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8460: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
8470: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
8480: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
8490: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
84a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
84b0: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
84c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
84d0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
84e0: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
84f0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
8500: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
8510: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
8520: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
8530: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
8540: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
8550: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8560: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8570: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8580: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8590: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
85a0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
85b0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
85c0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
85d0: 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c 6c  tic u8 *findCell
85e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
85f0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
8600: 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  8 *data = pPage-
8610: 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  >aData;.  assert
8620: 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20  ( iCell>=0 );.  
8630: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65  assert( iCell<ge
8640: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
8650: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
8660: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 61  ) );.  return da
8670: 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ta + get2byte(&d
8680: 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
8690: 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b  ffset+2*iCell]);
86a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  .}../*.** This a
86b0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
86c0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
86d0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
86e0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
86f0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
8700: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
8710: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
8720: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
8730: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
8740: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
8750: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
8760: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
8770: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
8780: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
8790: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
87a0: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
87b0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
87c0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
87d0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
87e0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
87f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
8800: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
8810: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
8820: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
8830: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
8840: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
8850: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
8860: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
8870: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
8880: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
8890: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
88a0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
88b0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
88c0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
88d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61 72  s function.  par
88e0: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
88f0: 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20 61   cell index.** a
8900: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
8910: 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65 43  ument and parseC
8920: 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20 61  ellPtr() takes a
8930: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
8940: 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  ** body of the c
8950: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
8960: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
8970: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
8980: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
8990: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
89a0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
89b0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
89c0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
89e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
89f0: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
8a00: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
8a10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
8a20: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8a30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20 20  */.){.  int n;  
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
8a60: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
8a70: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
8a80: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
8a90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8aa0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
8ab0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49 6e  ayload */..  pIn
8ac0: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
8ad0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
8ae0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
8af0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
8b00: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
8b10: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
8b20: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
8b30: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
8b40: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
8b50: 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   ){.    n += get
8b60: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
8b70: 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a  n], &nPayload);.
8b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61    }else{.    nPa
8b90: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  yload = 0;.  }. 
8ba0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
8bb0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28 20  nPayload;.  if( 
8bc0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
8bd0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
8be0: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
8bf0: 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  u64 *)&pInfo->nK
8c00: 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
8c10: 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20 2b    u32 x;.    n +
8c20: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
8c30: 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20  Cell[n], &x);.  
8c40: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8c50: 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  x;.    nPayload 
8c60: 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  += x;.  }.  pInf
8c70: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
8c80: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
8c90: 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20  >nHeader = n;.  
8ca0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
8cb0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
8cc0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
8cd0: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
8ce0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
8cf0: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
8d00: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
8d10: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
8d20: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
8d30: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8d40: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20      int nSize;  
8d50: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8d60: 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f   size of cell co
8d70: 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a  ntent in bytes *
8d80: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  /.    pInfo->nLo
8d90: 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  cal = nPayload;.
8da0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
8db0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53  flow = 0;.    nS
8dc0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
8dd0: 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   n;.    if( nSiz
8de0: 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  e<4 ){.      nSi
8df0: 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f  ze = 4;        /
8e00: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
8e10: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20  ize is 4 */.    
8e20: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  }.    pInfo->nSi
8e30: 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65  ze = nSize;.  }e
8e40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
8e50: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8e60: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8e70: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8e80: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8e90: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
8ea0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
8eb0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
8ec0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8ed0: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
8ee0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
8ef0: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
8f00: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
8f10: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
8f20: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
8f30: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
8f40: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
8f50: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
8f60: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
8f70: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
8f80: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
8f90: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
8fa0: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8fb0: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8fc0: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8fd0: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8fe0: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
8ff0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
9000: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
9010: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
9020: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
9030: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
9040: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
9050: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
9060: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
9070: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
9080: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
9090: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
90a0: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
90b0: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
90c0: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
90d0: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
90e0: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
90f0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9100: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
9110: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
9120: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
9130: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
9140: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
9150: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
9160: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
9170: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
9180: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
9190: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
91a0: 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20  cal = surplus;. 
91b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
91d0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
91e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
91f0: 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c  flow = pInfo->nL
9200: 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49  ocal + n;.    pI
9210: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
9220: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
9230: 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  4;.  }.}.static 
9240: 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c 28 0a  void parseCell(.
9250: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9260: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9270: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9280: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9290: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
92a0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
92b0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
92c0: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
92d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
92e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
92f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9300: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50  .){.  parseCellP
9310: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
9320: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
9330: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
9340: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
9350: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
9360: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
9370: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
9380: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
9390: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
93a0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
93b0: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
93c0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
93d0: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
93e0: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
93f0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
9400: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
9410: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
9420: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9430: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
9440: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
9450: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
9460: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
9470: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
9480: 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c  nfo;.  parseCell
9490: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26  (pPage, iCell, &
94a0: 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  info);.  return 
94b0: 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65  info.nSize;.}.#e
94c0: 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
94d0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
94e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
94f0: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
9500: 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65  fo info;.  parse
9510: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
9520: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
9530: 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a  return info.nSiz
9540: 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
9550: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9560: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
9570: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
9580: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
9590: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
95a0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
95b0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
95c0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
95d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
95e0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
95f0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
9600: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
9610: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
9620: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9630: 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c  ell){.  if( pCel
9640: 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  l ){.    CellInf
9650: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72 73  o info;.    pars
9660: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
9670: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
9680: 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f     assert( (info
9690: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
96a0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
96b0: 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
96c0: 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28 69  ad );.    if( (i
96d0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
96e0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
96f0: 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
9700: 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  al ){.      Pgno
9710: 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
9720: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
9730: 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
9740: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
9750: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
9760: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
9770: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
9780: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
97a0: 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .}./*.** If the 
97b0: 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20  cell with index 
97c0: 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50  iCell on page pP
97d0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
97e0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
97f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
9800: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
9810: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
9820: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
9830: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
9840: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
9850: 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67  apPutOvfl(MemPag
9860: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
9870: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c  ell){.  u8 *pCel
9880: 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  l;.  pCell = fin
9890: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
98a0: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72  age, iCell);.  r
98b0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f  eturn ptrmapPutO
98c0: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
98d0: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
98e0: 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f 66 20 61  ./* A bunch of a
98f0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9900: 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20  ts to check the 
9910: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
9920: 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  e variables.** o
9930: 66 20 68 61 6e 64 6c 65 20 70 20 28 74 79 70 65  f handle p (type
9940: 20 42 74 72 65 65 2a 29 20 61 72 65 20 69 6e 74   Btree*) are int
9950: 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
9960: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 62  nt..*/.#define b
9970: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
9980: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   \.  assert( p->
9990: 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
99a0: 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e  ONE || p->pBt->n
99b0: 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e 70  Transaction<p->p
99c0: 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20  Bt->nRef ); \.  
99d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
99e0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d  nTransaction<=p-
99f0: 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a  >pBt->nRef ); \.
9a00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
9a10: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
9a20: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70  =TRANS_NONE || p
9a30: 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ->pBt->nTransact
9a40: 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61 73  ion==0 ); \.  as
9a50: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e  sert( p->pBt->in
9a60: 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e  Transaction>=p->
9a70: 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a  inTrans ); ../*.
9a80: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
9a90: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
9aa0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
9ab0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
9ac0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
9ad0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
9ae0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
9af0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
9b00: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
9b10: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
9b20: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
9b30: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
9b40: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
9b50: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
9b60: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
9b70: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
9b80: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
9b90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9ba0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9bb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
9bc0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
9bd0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
9be0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
9bf0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
9c20: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
9c30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9c40: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
9c70: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
9c80: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ca0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
9cb0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
9cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9cd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
9ce0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
9cf0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
9d00: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
9d10: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9d20: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
9d30: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
9d40: 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
9d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9d60: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
9d70: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
9d80: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9da0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
9db0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
9dc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9dd0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
9de0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
9df0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9e00: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
9e10: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
9e20: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
9e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9e40: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9e50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9e70: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
9e80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9e90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
9ea0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
9eb0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
9ec0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
9ed0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 65 6d  flow==0 );.  tem
9ee0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
9ef0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  ( pPage->pBt->pa
9f00: 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
9f10: 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  temp==0 ) return
9f20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9f30: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
9f40: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
9f50: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
9f60: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
9f70: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9f80: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
9f90: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
9fa0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
9fb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
9fc0: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
9fd0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
9fe0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
9ff0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
a000: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
a010: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
a020: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
a030: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
a040: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
a050: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
a060: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
a070: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
a080: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
a090: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
a0a0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
a0b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
a0c0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
a0d0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
a0e0: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
a0f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a100: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
a110: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
a120: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
a130: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
a140: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
a150: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
a160: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
a170: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
a180: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a190: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
a1a0: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
a1b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a1c0: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
a1d0: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
a1e0: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
a1f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
a200: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
a210: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
a220: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
a230: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
a240: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  dr);.  sqliteFre
a250: 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74 75 72  e(temp);.  retur
a260: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a270: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
a280: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
a290: 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a 2a  ace on a page..*
a2a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
a2b0: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
a2c0: 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65  ->aData[] of the
a2d0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 2a   first byte of.*
a2e0: 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  * the new alloca
a2f0: 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e 20  tion. Or return 
a300: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
a310: 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a 2a  t enough free.**
a320: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
a330: 67 65 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ge to satisfy th
a340: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  e allocation req
a350: 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  uest..**.** If t
a360: 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
a370: 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20   nBytes of free 
a380: 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e  space but does n
a390: 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42  ot contain.** nB
a3a0: 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f  ytes of contiguo
a3b0: 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74  us free space, t
a3c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
a3d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a   automatically.*
a3e0: 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d  * calls defragem
a3f0: 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e  entPage() to con
a400: 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65  solidate all fre
a410: 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a  e space before .
a420: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  ** allocating th
a430: 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  e new chunk..*/.
a440: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
a450: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
a460: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
a470: 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  te){.  int addr,
a480: 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20   pc, hdr;.  int 
a490: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61  size;.  int nFra
a4a0: 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  g;.  int top;.  
a4b0: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74  int nCell;.  int
a4c0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75   cellOffset;.  u
a4d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
a4e0: 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20  ta;.  .  data = 
a4f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
a500: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a510: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a520: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a530: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a540: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 69 66 28  ge->pBt );.  if(
a550: 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74 65   nByte<4 ) nByte
a560: 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61 67   = 4;.  if( pPag
a570: 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20 7c  e->nFree<nByte |
a580: 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
a590: 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ow>0 ) return 0;
a5a0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
a5b0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20  -= nByte;.  hdr 
a5c0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
a5d0: 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64  et;..  nFrag = d
a5e0: 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66  ata[hdr+7];.  if
a5f0: 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20  ( nFrag<60 ){.  
a600: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
a610: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
a620: 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20   for a slot big 
a630: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
a640: 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61  y the.    ** spa
a650: 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20  ce request. */. 
a660: 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b     addr = hdr+1;
a670: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20  .    while( (pc 
a680: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a690: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a6a0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
a6b0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
a6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
a6d0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
a6e0: 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74     if( size<nByt
a6f0: 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e+4 ){.         
a700: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
a710: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
a720: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
a730: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61  ta[hdr+7] = nFra
a740: 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  g + size - nByte
a750: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
a760: 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn pc;.        }
a770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a780: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a790: 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65  c+2], size-nByte
a7a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
a7b0: 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20  urn pc + size - 
a7c0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d  nByte;.        }
a7d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a7e0: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a  ddr = pc;.    }.
a7f0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
a800: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
a810: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
a820: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
a830: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
a840: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a850: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
a860: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
a870: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
a880: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
a890: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
a8a0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
a8b0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a8c0: 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36  ;.  if( nFrag>=6
a8d0: 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20  0 || cellOffset 
a8e0: 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20  + 2*nCell > top 
a8f0: 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69  - nByte ){.    i
a900: 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  f( defragmentPag
a910: 65 28 70 50 61 67 65 29 20 29 20 72 65 74 75 72  e(pPage) ) retur
a920: 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  n 0;.    top = g
a930: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
a940: 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70  r+5]);.  }.  top
a950: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73   -= nByte;.  ass
a960: 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20  ert( cellOffset 
a970: 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70  + 2*nCell <= top
a980: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
a990: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a9a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b  );.  return top;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a9c0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
a9d0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
a9e0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
a9f0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
aa00: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
aa10: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
aa20: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
aa30: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
aa40: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
aa50: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
aa60: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
aa70: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
aa80: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
aa90: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
aaa0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
aab0: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
aac0: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
aad0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61  tic void freeSpa
aae0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
aaf0: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
ab00: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
ab10: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
ab20: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
ab30: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ab40: 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72  >aData;..  asser
ab50: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
ab60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ab70: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ab80: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ab90: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
aba0: 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d  t( start>=pPage-
abb0: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50  >hdrOffset+6+(pP
abc0: 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29  age->leaf?0:4) )
abd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61  ;.  assert( (sta
abe0: 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67  rt + size)<=pPag
abf0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ac00: 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65  ze );.  if( size
ac10: 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a  <4 ) size = 4;..
ac20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
ac30: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
ac40: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
ac50: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
ac60: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
ac70: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
ac80: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
ac90: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
aca0: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
acb0: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
acc0: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
acd0: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
ace0: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
acf0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
ad00: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
ad10: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
ad20: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
ad30: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
ad40: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
ad50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ad60: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
ad70: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
ad80: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
ad90: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
ada0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
adb0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
adc0: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
add0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
ade0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
adf0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
ae00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
ae10: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
ae20: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
ae30: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
ae40: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
ae50: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ae60: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ae70: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ae80: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ae90: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
aea0: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
aeb0: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
aec0: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
aed0: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
aee0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
aef0: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
af00: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
af10: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
af20: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
af30: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
af40: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
af50: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
af60: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
af70: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
af80: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
af90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afa0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
afb0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
afc0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
afd0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
afe0: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aff0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
b000: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
b010: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
b020: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
b030: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
b040: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
b050: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
b060: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
b070: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
b080: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
b090: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
b0a0: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
b0b0: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
b0c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b0d0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
b0e0: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
b0f0: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
b100: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
b110: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
b120: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
b130: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
b140: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
b150: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
b160: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
b170: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
b180: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
b190: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
b1a0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
b1b0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
b1c0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
b1d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
b1e0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
b1f0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
b200: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
b210: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
b220: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
b230: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
b240: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
b250: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
b260: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
b270: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
b280: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b290: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b2a0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b2b0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b2c0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b2d0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b2e0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b2f0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
b300: 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65  atic void decode
b310: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
b320: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
b330: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
b340: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
b350: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
b360: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b370: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b380: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
b390: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
b3a0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b3b0: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
b3c0: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
b3d0: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
b3e0: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
b3f0: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
b400: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
b410: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
b420: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
b430: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
b440: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b450: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
b460: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
b470: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
b480: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
b490: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
b4a0: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
b4b0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
b4c0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b4d0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b4e0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b4f0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b500: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
b510: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
b520: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b530: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
b540: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b550: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b560: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
b570: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
b580: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
b590: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
b5a0: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
b5b0: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
b5c0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b5d0: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b5e0: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b5f0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
b600: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
b610: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
b620: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
b630: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
b640: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
b650: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
b660: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
b670: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
b680: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
b690: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
b6a0: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
b6b0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
b6c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
b6d0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
b6e0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b6f0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
b700: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
b710: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b720: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
b730: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
b740: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
b750: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
b760: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
b770: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
b780: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
b790: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
b7a0: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
b7b0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
b7c0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
b7d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b7e0: 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  initPage(.  MemP
b7f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
b800: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
b810: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
b820: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
b830: 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  Parent       /* 
b840: 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67  The parent.  Mig
b850: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
b860: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b870: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b880: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b890: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b8a0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68  ata[] */.  int h
b8b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
b8c0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
b8d0: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
b8e0: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
b8f0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b900: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b910: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
b920: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
b930: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
b940: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
b950: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
b960: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b970: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
b980: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b990: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
b9a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b9b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b9c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b9d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
b9e0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b9f0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
ba00: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
ba10: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
ba20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ba30: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ba40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ba50: 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  ea */..  pBt = p
ba60: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
ba70: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
ba80: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
ba90: 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
baa0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73  pBt==pBt );.  as
bab0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
bac0: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
bad0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
bae0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
baf0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
bb00: 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67 6e  ata == &((unsign
bb10: 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29 5b  ed char*)pPage)[
bb20: 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  -pBt->pageSize] 
bb30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
bb40: 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e 74  pParent!=pParent
bb50: 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61 72   && (pPage->pPar
bb60: 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d  ent!=0 || pPage-
bb70: 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20 20  >isInit) ){.    
bb80: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70 61  /* The parent pa
bb90: 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
bba0: 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74 68  change unless th
bbb0: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
bbc0: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
bbd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bbe0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
bbf0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20 72  Page->isInit ) r
bc00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bc10: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
bc20: 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  arent==0 && pPar
bc30: 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 50  ent!=0 ){.    pP
bc40: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  age->pParent = p
bc50: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
bc60: 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
bc70: 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
bc80: 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65   }.  hdr = pPage
bc90: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64  ->hdrOffset;.  d
bca0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bcb0: 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  ta;.  decodeFlag
bcc0: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
bcd0: 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  r]);.  pPage->nO
bce0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
bcf0: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
bd00: 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   0;.  usableSize
bd10: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
bd20: 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  ze;.  pPage->cel
bd30: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
bd40: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
bd50: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
bd60: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
bd70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
bd80: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
bd90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bda0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
bdb0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
bdc0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
bdd0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bde0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bdf0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
be00: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
be10: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
be20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
be30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
be40: 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  e->nCell==0 && p
be50: 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50 61  Parent!=0 && pPa
be60: 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  rent->pgno!=1 ){
be70: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65  .    /* All page
be80: 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20 6c  s must have at l
be90: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65  east one cell, e
bea0: 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20 70  xcept for root p
beb0: 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ages */.    retu
bec0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bed0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
bee0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
bef0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
bf00: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bf10: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
bf20: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
bf30: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
bf40: 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c  7] + top - (cell
bf50: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
bf60: 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c  ->nCell);.  whil
bf70: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 69  e( pc>0 ){.    i
bf80: 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  nt next, size;. 
bf90: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
bfa0: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
bfb0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73  /* Free block is
bfc0: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
bfd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bfe0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bff0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65  T; .    }.    ne
c000: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
c010: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69  ata[pc]);.    si
c020: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c030: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c040: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
c050: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
c060: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
c070: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
c080: 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
c090: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
c0a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c0b0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c0c0: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
c0d0: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
c0e0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
c0f0: 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66 28  e = nFree;.  if(
c100: 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69   nFree>=usableSi
c110: 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65  ze ){.    /* Fre
c120: 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65  e space cannot e
c130: 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65  xceed total page
c140: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74   size */.    ret
c150: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c160: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
c170: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
c180: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
c190: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c1a0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c1b0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c1c0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c1d0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c1e0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c1f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c200: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c210: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c220: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c230: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c240: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c250: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c260: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68 64  e->pBt;.  int hd
c270: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
c280: 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72 73  fset;.  int firs
c290: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
c2a0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
c2b0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
c2c0: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
c2d0: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 26  o );.  assert( &
c2e0: 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  data[pBt->pageSi
c2f0: 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65 64  ze] == (unsigned
c300: 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a   char*)pPage );.
c310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c320: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
c330: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
c340: 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ) );.  memset(&d
c350: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
c360: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
c370: 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d  dr);.  data[hdr]
c380: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73   = flags;.  firs
c390: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
c3a0: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
c3b0: 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  )==0);.  memset(
c3c0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
c3d0: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
c3e0: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
c3f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c400: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c410: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
c420: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
c430: 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64  ize - first;.  d
c440: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
c450: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
c460: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
c470: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
c480: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
c490: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
c4a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
c4b0: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
c4c0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c4d0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c4e0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit = 1;.}../*.*
c4f0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c500: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
c510: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c520: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c530: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c540: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c560: 67 65 74 50 61 67 65 28 42 74 53 68 61 72 65 64  getPage(BtShared
c570: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
c580: 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61  , MemPage **ppPa
c590: 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29  ge, int clrFlag)
c5a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
c5b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
c5c0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
c5d0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
c5e0: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
c5f0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
c600: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
c610: 67 65 2c 20 63 6c 72 46 6c 61 67 29 3b 0a 20 20  ge, clrFlag);.  
c620: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c630: 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  rc;.  pPage = (M
c640: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
c650: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c660: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c670: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c680: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c690: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c6a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c6b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c6c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c6d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c6e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c6f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c700: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70   ? 100 : 0;.  *p
c710: 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
c720: 20 69 66 28 20 63 6c 72 46 6c 61 67 20 29 7b 0a   if( clrFlag ){.
c730: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c740: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 70 50 61  DontRollback(pPa
c750: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
c760: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c770: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
c780: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
c790: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
c7a0: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
c7b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
c7c0: 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e  just a convenien
c7d0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
c7e0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
c7f0: 20 74 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29   to.** getPage()
c800: 20 61 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e   and initPage().
c810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
c820: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
c830: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
c840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c850: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
c860: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
c870: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c880: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
c890: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
c8a0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
c8b0: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
c8c0: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
c8d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
c8e0: 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  ent     /* Paren
c8f0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
c900: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
c910: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
c920: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c930: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c940: 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61    }.  rc = getPa
c950: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
c960: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
c970: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c980: 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
c990: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  it==0 ){.    rc 
c9a0: 3d 20 69 6e 69 74 50 61 67 65 28 2a 70 70 50 61  = initPage(*ppPa
c9b0: 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
c9c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c9d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
c9e0: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
c9f0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
ca00: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
ca10: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
ca20: 20 67 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61   getPage..*/.sta
ca30: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
ca40: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
ca50: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
ca60: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
ca70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
ca80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ca90: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
caa0: 73 73 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61  ssert( &pPage->a
cab0: 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d  Data[pPage->pBt-
cac0: 3e 70 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73  >pageSize]==(uns
cad0: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67  igned char*)pPag
cae0: 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
caf0: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
cb00: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
cb10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
cb20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cb30: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
cb40: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
cb50: 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a  age.** reaches z
cb60: 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ero.  We need to
cb70: 20 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65   unref the pPare
cb80: 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20  nt pointer when 
cb90: 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e  that.** happens.
cba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cbb0: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44  pageDestructor(D
cbc0: 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e  bPage *pData, in
cbd0: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d  t pageSize){.  M
cbe0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
cbf0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
cc00: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
cc10: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
cc20: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
cc30: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
cc40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
cc50: 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50  rent ){.    MemP
cc60: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  age *pParent = p
cc70: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
cc80: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
cc90: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
cca0: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
ccb0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
ccc0: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
ccd0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
cce0: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
ccf0: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
cd00: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
cd10: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
cd20: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
cd30: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
cd40: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
cd50: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
cd60: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
cd70: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
cd80: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
cd90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
cda0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
cdb0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
cdc0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
cdd0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
cde0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
cdf0: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
ce00: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
ce10: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
ce20: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
ce30: 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69  DbPage *pData, i
ce40: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
ce50: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
ce60: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
ce70: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
ce80: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
ce90: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
cea0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
ceb0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
cec0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Init ){.    pPag
ced0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
cee0: 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
cef0: 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  e, pPage->pParen
cf00: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
cf10: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
cf20: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
cf30: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
cf40: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
cf50: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
cf60: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
cf70: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
cf80: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
cf90: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
cfa0: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
cfb0: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
cfc0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
cfd0: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
cfe0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
cff0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e  is called..*/.in
d000: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
d010: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
d020: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
d030: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
d040: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
d050: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
d060: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53  */.  sqlite3 *pS
d070: 71 6c 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  qlite,       /* 
d080: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
d090: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d0a0: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
d0b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d0c0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
d0d0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
d0e0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
d0f0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
d100: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29   /* Options */.)
d110: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
d120: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
d130: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
d140: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
d150: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
d160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
d170: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
d180: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  /.  int rc;.  in
d190: 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e  t nReserve;.  un
d1a0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
d1b0: 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23 69 66 20  eader[100];.#if 
d1c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d1d0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d1e0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
d1f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
d200: 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  O).  const Threa
d210: 64 44 61 74 61 20 2a 70 54 73 64 72 6f 3b 0a 23  dData *pTsdro;.#
d220: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
d230: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
d240: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
d250: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
d260: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
d270: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
d280: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
d290: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
d2a0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
d2b0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
d2c0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
d2d0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
d2e0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
d2f0: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
d300: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
d310: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
d320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
d330: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
d340: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d350: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
d360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
d370: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
d380: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
d390: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
d3a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
d3b0: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
d3c0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
d3d0: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
d3e0: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
d3f0: 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  if..  p = sqlite
d400: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  Malloc(sizeof(Bt
d410: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
d420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d430: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d440: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
d450: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
d460: 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c 69 74  pSqlite = pSqlit
d470: 65 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  e;..  /* Try to 
d480: 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
d490: 20 42 74 72 65 65 20 73 74 72 75 63 74 75 72 65   Btree structure
d4a0: 20 6f 70 65 6e 65 64 20 6f 6e 20 7a 46 69 6c 65   opened on zFile
d4b0: 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66 20 21 64 65  name. */.#if !de
d4c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d4d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
d4e0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
d4f0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
d500: 20 20 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74    pTsdro = sqlit
d510: 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
d520: 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54  Only();.  if( pT
d530: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
d540: 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ata && zFilename
d550: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
d560: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
d570: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
d580: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
d590: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d5a0: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
d5b0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
d5c0: 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20 20 20  teFree(p);.     
d5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d5e0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
d5f0: 66 6f 72 28 70 42 74 3d 70 54 73 64 72 6f 2d 3e  for(pBt=pTsdro->
d600: 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42 74  pBtree; pBt; pBt
d610: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
d620: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
d630: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
d640: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
d650: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
d660: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
d670: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
d680: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
d690: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
d6a0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
d6b0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
d6c0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  f++;.        sql
d6d0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
d6e0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
d6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d710: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
d720: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d730: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
d740: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
d750: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
d760: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
d770: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
d780: 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a 2a 20   btree are.  ** 
d790: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
d7a0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
d7b0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
d7c0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
d7d0: 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  lt.  ** when com
d7e0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
d7f0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
d800: 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  re..  */.  asser
d810: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
d820: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
d830: 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
d840: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
d850: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
d860: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  4 );.  assert( s
d870: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
d880: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
d890: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 61  f(u16)==2 );.  a
d8a0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
d8b0: 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70 42 74  no)==4 );..  pBt
d8c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
d8d0: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
d8e0: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
d8f0: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
d900: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  0;.    sqliteFre
d910: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
d920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d930: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
d940: 33 50 61 67 65 72 4f 70 65 6e 28 26 70 42 74 2d  3PagerOpen(&pBt-
d950: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
d960: 6d 65 2c 20 45 58 54 52 41 5f 53 49 5a 45 2c 20  me, EXTRA_SIZE, 
d970: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
d980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
d9a0: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
d9b0: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
d9c0: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
d9d0: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 7d  ,zDbHeader);.  }
d9e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d9f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
da00: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
da10: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
da20: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
da30: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
da40: 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a  qliteFree(pBt);.
da50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
da60: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
da70: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
da80: 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42 74  rc;.  }.  p->pBt
da90: 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74   = pBt;..  sqlit
daa0: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
dab0: 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ctor(pBt->pPager
dac0: 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  , pageDestructor
dad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
dae0: 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74  rSetReiniter(pBt
daf0: 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65  ->pPager, pageRe
db00: 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70 43  init);.  pBt->pC
db10: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42 74  ursor = 0;.  pBt
db20: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
db30: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
db40: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
db50: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
db60: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  er);.  pBt->page
db70: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
db80: 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b  &zDbHeader[16]);
db90: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
dba0: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
dbb0: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
dbc0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
dbd0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
dbe0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
dbf0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
dc00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
dc10: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
dc20: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
dc30: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
dc40: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
dc50: 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  25% */.    pBt->
dc60: 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 33  minEmbedFrac = 3
dc70: 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f  2;   /* 12.5% */
dc80: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  .    pBt->minLea
dc90: 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20 2f  fFrac = 32;    /
dca0: 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e 64  * 12.5% */.#ifnd
dcb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dcc0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
dcd0: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
dce0: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
dcf0: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
dd00: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
dd10: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 64 6f 20   then.    ** do 
dd20: 6e 6f 74 20 73 65 74 20 74 68 65 20 61 75 74 6f  not set the auto
dd30: 2d 76 61 63 75 75 6d 20 66 6c 61 67 2c 20 65 76  -vacuum flag, ev
dd40: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 45 46  en if SQLITE_DEF
dd50: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  AULT_AUTOVACUUM.
dd60: 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2e 20      ** is true. 
dd70: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
dd80: 64 2c 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  d, if SQLITE_OMI
dd90: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
dda0: 65 65 6e 20 64 65 66 69 6e 65 64 2c 0a 20 20 20  een defined,.   
ddb0: 20 2a 2a 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72   ** then ":memor
ddc0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 20 72 65  y:" is just a re
ddd0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
dde0: 20 52 65 73 70 65 63 74 20 74 68 65 20 61 75 74   Respect the aut
ddf0: 6f 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  o-vacuum.    ** 
de00: 64 65 66 61 75 6c 74 20 69 6e 20 74 68 69 73 20  default in this 
de10: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
de20: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
de30: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
de40: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
de50: 75 75 6d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  uum = SQLITE_DEF
de60: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3b  AULT_AUTOVACUUM;
de70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
de80: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
de90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
dea0: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
deb0: 72 5b 32 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e  r[20];.    pBt->
dec0: 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 7a  maxEmbedFrac = z
ded0: 44 62 48 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20  DbHeader[21];.  
dee0: 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46    pBt->minEmbedF
def0: 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rac = zDbHeader[
df00: 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  22];.    pBt->mi
df10: 6e 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48  nLeafFrac = zDbH
df20: 65 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70  eader[23];.    p
df30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
df40: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
df50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
df60: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
df70: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
df80: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
df90: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
dfa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
dfb0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
dfc0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
dfd0: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 61 73 73   nReserve;.  ass
dfe0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
dff0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
e000: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
e010: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
e020: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  */.  sqlite3Page
e030: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
e040: 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 70  ->pPager, pBt->p
e050: 61 67 65 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21  ageSize);..#if !
e060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e070: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
e080: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
e090: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
e0a0: 29 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e  ).  /* Add the n
e0b0: 65 77 20 62 74 72 65 65 20 74 6f 20 74 68 65 20  ew btree to the 
e0c0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
e0d0: 74 69 6e 67 20 61 74 20 54 68 72 65 61 64 44 61  ting at ThreadDa
e0e0: 74 61 2e 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20  ta.pBtree..  ** 
e0f0: 54 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  There is no chan
e100: 63 65 20 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63  ce that a malloc
e110: 28 29 20 6d 61 79 20 66 61 69 6c 20 69 6e 73 69  () may fail insi
e120: 64 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  de of the .  ** 
e130: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e140: 61 28 29 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  a() call, as the
e150: 20 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75   ThreadData stru
e160: 63 74 75 72 65 20 6d 75 73 74 20 68 61 76 65 20  cture must have 
e170: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
e180: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  n allocated for 
e190: 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65  pTsdro->useShare
e1a0: 64 44 61 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d  dData to be non-
e1b0: 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  zero..  */.  if(
e1c0: 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72   pTsdro->useShar
e1d0: 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e  edData && zFilen
e1e0: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
e1f0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  ){.    pBt->pNex
e200: 74 20 3d 20 70 54 73 64 72 6f 2d 3e 70 42 74 72  t = pTsdro->pBtr
e210: 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ee;.    sqlite3T
e220: 68 72 65 61 64 44 61 74 61 28 29 2d 3e 70 42 74  hreadData()->pBt
e230: 72 65 65 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23  ree = pBt;.  }.#
e240: 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65  endif.  pBt->nRe
e250: 66 20 3d 20 31 3b 0a 20 20 2a 70 70 42 74 72 65  f = 1;.  *ppBtre
e260: 65 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20  e = p;.  return 
e270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e280: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
e290: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
e2a0: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
e2b0: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
e2c0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
e2d0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
e2e0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e2f0: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
e300: 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20  *pCur;..#ifndef 
e310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
e320: 45 44 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61  ED_CACHE.  Threa
e330: 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e  dData *pTsd;.#en
e340: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
e350: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
e360: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
e370: 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d  le.  */.  pCur =
e380: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
e390: 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
e3a0: 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
e3b0: 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
e3c0: 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
e3d0: 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
e3e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
e3f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e400: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
e410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e420: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
e430: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
e440: 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
e450: 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
e460: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
e470: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
e480: 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
e490: 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
e4a0: 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
e4b0: 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
e4c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
e4d0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69  lback(p);.  sqli
e4e0: 74 65 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e  teFree(p);..#ifn
e4f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e500: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
e510: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
e520: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
e530: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
e540: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
e550: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
e560: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
e570: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
e580: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
e590: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
e5a0: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
e5b0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
e5c0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
e5d0: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
e5e0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
e5f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e600: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
e610: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e620: 68 61 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d  hared-btree from
e630: 20 74 68 65 20 74 68 72 65 61 64 20 77 69 64 65   the thread wide
e640: 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a   list. Call .  *
e650: 2a 20 54 68 72 65 61 64 44 61 74 61 52 65 61 64  * ThreadDataRead
e660: 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20  Only() and then 
e670: 63 61 73 74 20 61 77 61 79 20 74 68 65 20 63 6f  cast away the co
e680: 6e 73 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20  nst property of 
e690: 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  the .  ** pointe
e6a0: 72 20 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63  r to avoid alloc
e6b0: 61 74 69 6e 67 20 74 68 72 65 61 64 20 64 61 74  ating thread dat
e6c0: 61 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72  a if it is not r
e6d0: 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a  eally required..
e6e0: 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54    */.  pTsd = (T
e6f0: 68 72 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69  hreadData *)sqli
e700: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
e710: 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70  dOnly();.  if( p
e720: 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  Tsd->pBtree==pBt
e730: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e740: 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72  pTsd==sqlite3Thr
e750: 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20  eadData() );.   
e760: 20 70 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20   pTsd->pBtree = 
e770: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  pBt->pNext;.  }e
e780: 6c 73 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65  lse{.    BtShare
e790: 64 20 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f  d *pPrev;.    fo
e7a0: 72 28 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42  r(pPrev=pTsd->pB
e7b0: 74 72 65 65 3b 20 70 50 72 65 76 20 26 26 20 70  tree; pPrev && p
e7c0: 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74  Prev->pNext!=pBt
e7d0: 3b 20 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70  ; pPrev=pPrev->p
e7e0: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20  Next){}.    if( 
e7f0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61  pPrev ){.      a
e800: 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c  ssert( pTsd==sql
e810: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e820: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d   );.      pPrev-
e830: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
e840: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ext;.    }.  }.#
e850: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73  endif..  /* Clos
e860: 65 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  e the pager and 
e870: 66 72 65 65 20 74 68 65 20 73 68 61 72 65 64 2d  free the shared-
e880: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
e890: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  */.  assert( !pB
e8a0: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
e8b0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
e8c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
e8d0: 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
e8e0: 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
e8f0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42  Schema ){.    pB
e900: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
e910: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
e920: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
e930: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
e940: 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b  sqliteFree(pBt);
e950: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e960: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
e970: 61 6e 67 65 20 74 68 65 20 62 75 73 79 20 68 61  ange the busy ha
e980: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  ndler callback f
e990: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
e9a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 42  sqlite3BtreeSetB
e9b0: 75 73 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65  usyHandler(Btree
e9c0: 20 2a 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72   *p, BusyHandler
e9d0: 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42   *pHandler){.  B
e9e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
e9f0: 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42  ->pBt;.  pBt->pB
ea00: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61  usyHandler = pHa
ea10: 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  ndler;.  sqlite3
ea20: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
ea30: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
ea40: 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65   pHandler);.  re
ea50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ea60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
ea70: 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
ea80: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ea90: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
eaa0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
eab0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
eac0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
ead0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
eae0: 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
eaf0: 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
eb00: 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
eb10: 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
eb20: 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
eb30: 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
eb40: 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
eb50: 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
eb60: 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
eb70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
eb80: 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
eb90: 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
eba0: 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
ebb0: 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
ebc0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
ebd0: 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
ebe0: 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
ebf0: 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
ec00: 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
ec10: 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
ec20: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
ec30: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
ec40: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
ec50: 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
ec60: 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
ec70: 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
ec80: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
ec90: 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
eca0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
ecb0: 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
ecc0: 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
ecd0: 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
ece0: 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
ecf0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
ed00: 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
ed10: 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
ed20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
ed30: 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
ed40: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
ed50: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ed60: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
ed70: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
ed80: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
ed90: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 72 65  r, mxPage);.  re
eda0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
edb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
edc0: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
edd0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
ede0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
edf0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
ee00: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
ee10: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
ee20: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
ee30: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
ee40: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
ee50: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
ee60: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
ee70: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
ee80: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
ee90: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
eea0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
eeb0: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
eec0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
eed0: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
eee0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
eef0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
ef00: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
ef10: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
ef20: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
ef30: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
ef40: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
ef50: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
ef60: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
ef70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ef80: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
ef90: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
efa0: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
efb0: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
efc0: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
efd0: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
efe0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
eff0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
f000: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
f010: 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
f020: 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72 65   fullSync);.  re
f030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f040: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f050: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
f060: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
f070: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
f080: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
f090: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
f0a0: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
f0b0: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
f0c0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
f0d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f0e0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
f0f0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
f100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
f110: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
f120: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
f130: 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  r );.  return sq
f140: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
f150: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d  (pBt->pPager);.}
f160: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
f170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
f180: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
f190: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f1a0: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
f1b0: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
f1c0: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
f1d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
f1e0: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
f1f0: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
f200: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
f210: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
f220: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
f230: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
f240: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
f250: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
f260: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
f270: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
f280: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
f290: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
f2a0: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
f2b0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
f2c0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
f2d0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
f2e0: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
f2f0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
f300: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
f310: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
f320: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
f330: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
f340: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
f350: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
f360: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
f370: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
f380: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
f390: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
f3a0: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
f3b0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f3c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
f3d0: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
f3e0: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
f3f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
f400: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
f410: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
f420: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
f430: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
f440: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f450: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
f460: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
f470: 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  ixed ){.    retu
f480: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
f490: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
f4a0: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
f4b0: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
f4c0: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
f4d0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
f4e0: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
f4f0: 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
f500: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
f510: 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
f520: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
f530: 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
f540: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
f550: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
f570: 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
f580: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
f590: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f5a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
f5b0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
f5c0: 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b  ager, pageSize);
f5d0: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
f5e0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
f5f0: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
f600: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
f610: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f620: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
f630: 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
f640: 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
f650: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
f660: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
f670: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
f680: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e  ->pageSize;.}.in
f690: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f6a0: 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
f6b0: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
f6c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f6d0: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
f6e0: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
f6f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f700: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
f710: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
f720: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
f730: 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
f740: 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
f750: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
f760: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f770: 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
f780: 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
f790: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
f7a0: 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
f7b0: 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
f7c0: 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
f7d0: 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
f7e0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
f7f0: 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
f800: 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
f810: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
f820: 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
f830: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
f840: 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
f850: 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
f860: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
f870: 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
f880: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f890: 74 20 3d 20 70 2d 3e 70 42 74 3b 3b 0a 23 69 66  t = p->pBt;;.#if
f8a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f8b0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
f8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
f8d0: 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  NLY;.#else.  if(
f8e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
f8f0: 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  xed ){.    retur
f900: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
f910: 59 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75  Y;.  }.  pBt->au
f920: 74 6f 56 61 63 75 75 6d 20 3d 20 28 61 75 74 6f  toVacuum = (auto
f930: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 72  Vacuum?1:0);.  r
f940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f950: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f960: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
f970: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
f980: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
f990: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
f9a0: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
f9b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
f9c0: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
f9d0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
f9e0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
f9f0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
fa00: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
fa10: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 30 3b  CUUM.  return 0;
fa20: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
fa30: 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
fa40: 75 6d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  um;.#endif.}.../
fa50: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
fa60: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
fa70: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
fa80: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
fa90: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
faa0: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
fab0: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
fac0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
fad0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
fae0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
faf0: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
fb00: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
fb10: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
fb20: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
fb30: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
fb40: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
fb50: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
fb60: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
fb70: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
fb80: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
fb90: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
fba0: 2e 20 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  .  SQLITE_PROTOC
fbb0: 4f 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OL is returned.*
fbc0: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
fbd0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
fbe0: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   violation..*/.s
fbf0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
fc00: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
fc10: 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70 61  t){.  int rc, pa
fc20: 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67  geSize;.  MemPag
fc30: 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 66 28  e *pPage1;.  if(
fc40: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72   pBt->pPage1 ) r
fc50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fc60: 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28  .  rc = getPage(
fc70: 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
fc80: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
fc90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
fca0: 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44  n rc;.  ..  /* D
fcb0: 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
fcc0: 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
fcd0: 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
fce0: 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
fcf0: 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
fd00: 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
fd10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
fd20: 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  DB;.  if( sqlite
fd30: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
fd40: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
fd50: 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  {.    u8 *page1 
fd60: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
fd70: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
fd80: 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
fd90: 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
fda0: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
fdb0: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
fdc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
fdd0: 5b 31 38 5d 3e 31 20 7c 7c 20 70 61 67 65 31 5b  [18]>1 || page1[
fde0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
fdf0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
fe00: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
fe10: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
fe20: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
fe30: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
fe40: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
fe50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
fe60: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fe70: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
fe80: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
fe90: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
fea0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
feb0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
fec0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
fed0: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
fee0: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
fef0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35  Bt->usableSize<5
ff00: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
ff10: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
ff20: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
ff30: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
ff40: 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20  = page1[21];.   
ff50: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
ff60: 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a  ac = page1[22];.
ff70: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
ff80: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d  Frac = page1[23]
ff90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ffa0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ffb0: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
ffc0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ffd0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
ffe0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
fff0: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
10000 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
10010 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
10020 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
10030 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
10040 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
10050 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
10060 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
10070 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
10080 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
10090 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
100a0 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
100b0 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
100c0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
100d0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
100e0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
100f0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
10100 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
10110 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
10120 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
10130 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
10140 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
10150 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
10160 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
10170 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
10180 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
10190 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
101a0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
101b0 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
101c0 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
101d0 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
101e0 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
101f0 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
10200 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
10210 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
10220 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
10230 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
10240 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
10250 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
10260 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
10270 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
10280 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
10290 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
102a0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
102b0 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
102c0 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
102d0 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
102e0 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
102f0 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
10300 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10310 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
10320 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
10330 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
10340 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
10350 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
10360 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
10370 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
10380 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
10390 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
103a0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
103b0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
103c0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
103d0 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
103e0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
103f0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
10400 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
10410 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
10420 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
10430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
10440 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
10450 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
10460 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
10470 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
10480 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
10490 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
104a0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
104b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
104c0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
104d0 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
104e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
104f0 4b 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  K;.  if( pRef->i
10500 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
10510 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
10520 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
10530 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
10540 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
10550 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
10560 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10570 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
10580 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
10590 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
105a0 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
105b0 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
105c0 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
105d0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
105e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
105f0 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
10600 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
10610 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
10620 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
10630 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10640 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
10650 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10660 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
10670 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
10680 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
10690 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
106a0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
106b0 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
106c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
106d0 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
106e0 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
106f0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
10700 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10710 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
10720 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
10730 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
10740 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
10750 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10760 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
10770 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
10780 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
10790 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
107a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
107b0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
107c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
107d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
107e0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
107f0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
10800 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
10810 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
10820 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
10830 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26  Bt->pCursor==0 &
10840 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
10850 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
10860 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
10870 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31  (pBt->pPager)>=1
10880 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
10890 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
108a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
108b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
108c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
108d0 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
108e0 61 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67 65  a = &((u8*)pPage
108f0 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
10900 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ];.        pPage
10910 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
10920 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
10930 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
10940 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10950 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
10960 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
10970 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
10980 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
10990 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
109a0 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
109b0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
109c0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
109d0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
109e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
109f0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
10a00 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
10a10 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
10a20 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
10a30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
10a40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
10a50 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10a60 65 72 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53  er)>0 ) return S
10a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20  QLITE_OK;.  pP1 
10a80 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
10a90 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
10aa0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
10ab0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
10ac0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10ad0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
10ae0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
10af0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
10b00 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
10b10 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
10b20 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
10b30 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
10b40 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
10b50 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10b60 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
10b70 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
10b80 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
10b90 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
10ba0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
10bb0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
10bc0 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
10bd0 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
10be0 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  ac;.  data[22] =
10bf0 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
10c00 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  ac;.  data[23] =
10c10 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
10c20 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  c;.  memset(&dat
10c30 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
10c40 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
10c50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
10c60 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
10c70 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
10c80 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
10c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10ca0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
10cb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
10cc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 70 75 74  acuum ){.    put
10cd0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
10ce0 20 34 2a 34 5d 2c 20 31 29 3b 0a 20 20 7d 0a 23   4*4], 1);.  }.#
10cf0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
10d00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10d10 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
10d20 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
10d30 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
10d40 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
10d50 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
10d60 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10d70 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
10d80 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
10d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
10da0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
10db0 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
10dc0 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
10dd0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
10de0 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
10df0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
10e00 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
10e10 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
10e20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
10e30 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
10e40 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
10e50 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
10e60 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
10e70 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
10e80 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
10e90 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
10ea0 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
10eb0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
10ec0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
10ed0 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
10ee0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10ef0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
10f00 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
10f10 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
10f20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
10f30 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
10f40 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
10f50 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
10f60 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
10f70 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
10f80 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
10f90 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
10fa0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
10fb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
10fc0 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
10fd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
10fe0 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
10ff0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
11000 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
11010 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
11020 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
11030 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
11040 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
11050 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
11060 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
11070 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
11080 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
11090 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
110a0 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
110b0 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
110c0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
110d0 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
110e0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
110f0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11100 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
11110 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
11120 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
11130 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
11140 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
11150 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
11160 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
11170 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
11180 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
11190 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
111a0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
111b0 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
111c0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
111d0 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
111e0 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
111f0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
11200 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
11210 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
11220 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
11230 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
11240 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
11250 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
11260 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
11270 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
11280 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
11290 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
112a0 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
112b0 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
112c0 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
112d0 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
112e0 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
112f0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
11300 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
11310 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
11320 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
11330 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
11340 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
11350 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
11360 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
11370 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
11380 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
11390 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
113a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
113b0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
113c0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
113d0 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65  flag){.  BtShare
113e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
113f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11400 54 45 5f 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49  TE_OK;..  btreeI
11410 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
11420 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
11430 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
11440 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
11450 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
11460 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
11470 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
11480 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
11490 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
114a0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
114b0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
114c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
114d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
114e0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
114f0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
11500 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ag) ){.    retur
11510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11520 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
11530 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
11540 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
11550 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
11560 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
11570 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
11580 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
11590 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
115a0 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  Y;.  }..  /* If 
115b0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
115c0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
115d0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
115e0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
115f0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
11600 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
11610 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
11620 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11630 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
11640 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
11650 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
11660 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
11670 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11680 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29  RITE && wrflag )
11690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
116a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
116b0 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
116c0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
116d0 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42        rc = lockB
116e0 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  tree(pBt);.    }
116f0 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
11700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
11710 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  lag ){.      rc 
11720 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
11730 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
11740 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
11750 3e 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  >1);.      if( r
11760 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11770 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
11780 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
11790 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
117a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
117b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
117c0 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d  f( wrflag ) pBt-
117d0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
117e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
117f0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
11800 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
11810 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
11820 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
11830 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11840 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
11850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6e         sqlite3In
11860 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11870 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  pBt->pBusyHandle
11880 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  r) );..  if( rc=
11890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
118a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
118b0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
118c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
118d0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  saction++;.    }
118e0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
118f0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
11900 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
11910 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
11920 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
11930 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
11940 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
11950 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
11960 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  s;.    }.  }..  
11970 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
11980 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11990 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
119a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
119b0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
119c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
119d0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
119e0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
119f0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
11a00 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
11a10 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
11a20 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
11a30 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
11a40 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
11a50 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
11a60 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
11a70 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
11a80 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
11a90 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
11aa0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  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 2f 2a 20 43 6f 75 6e 74 65         /* Counte
11ad0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
11ae0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 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 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11b10 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
11b20 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  age */.  int rc 
11b30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11b50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11b60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11b70 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
11b80 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
11b90 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
11ba0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
11bb0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74  e->pgno;..  init
11bc0 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  Page(pPage, 0);.
11bd0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
11be0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
11bf0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
11c00 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
11c10 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
11c20 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d  e, i);..    rc =
11c30 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
11c40 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
11c50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11c70 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
11c80 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
11c90 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  }..    if( !pPag
11ca0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
11cb0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
11cc0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
11cd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
11ce0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
11cf0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
11d00 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  TREE, pgno);.   
11d10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11d20 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f  E_OK ) goto set_
11d30 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11d40 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
11d50 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
11d60 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
11d70 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
11d80 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
11d90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11da0 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  +8]);.    rc = p
11db0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
11dc0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
11dd0 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
11de0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
11df0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
11e00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
11e10 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
11e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
11e30 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
11e40 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 65  , which is guare
11e50 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74  nteed to be a bt
11e60 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e  ree page, not an
11e70 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
11e80 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
11e90 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d  to page iFrom. M
11ea0 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
11eb0 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
11ec0 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20  ints to.** iTo. 
11ed0 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
11ee0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
11ef0 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
11f00 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
11f10 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   .** follows:.**
11f20 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
11f30 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
11f40 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
11f50 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
11f60 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
11f90 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
11fa0 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
11fb0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
11fc0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
11fd0 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
11fe0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11ff0 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
12000 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
12010 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
12020 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
12030 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
12040 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
12050 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
12060 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
12070 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
12080 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
12090 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
120a0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
120b0 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
120c0 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
120d0 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
120e0 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
120f0 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54 79  Type){.  if( eTy
12100 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
12110 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
12120 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
12130 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
12140 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
12150 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
12160 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
12170 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
12180 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
12190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
121a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
121b0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
121c0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
121d0 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
121e0 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
121f0 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
12200 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
12210 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
12220 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67     initPage(pPag
12230 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  e, 0);.    nCell
12240 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
12250 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
12260 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
12270 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
12280 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
12290 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
122a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
122b0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
122c0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
122d0 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65 6c          parseCel
122e0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
122f0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
12300 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
12310 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
12320 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
12330 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
12340 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
12350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
12360 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
12370 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
12380 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
12390 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
123a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
123b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
123c0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
123d0 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
123e0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
123f0 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
12400 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
12410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
12430 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
12440 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
12450 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
12460 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
12470 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
12480 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
12490 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
124a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
124b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
124c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
124d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
124e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
124f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
12500 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
12510 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
12520 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
12530 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
12540 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12550 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
12560 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
12570 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
12580 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
12590 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
125a0 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
125b0 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
125c0 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
125d0 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
125e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
125f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
12600 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
12610 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
12620 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
12630 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
12640 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
12650 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12660 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
12670 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
12680 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
12690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
126a0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
126b0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
126c0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
126d0 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20 20  iFreePage       
126e0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
126f0 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
12700 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d  age to */.){.  M
12710 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
12720 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
12730 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
12740 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
12750 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
12760 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
12770 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
12780 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
12790 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
127a0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
127b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
127c0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
127d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
127e0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
127f0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
12800 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
12810 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  PAGE );..  /* Mo
12820 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
12830 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65 6e  from it's curren
12840 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
12850 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
12860 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
12870 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
12880 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
12890 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
128a0 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
128b0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
128c0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
128d0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
128e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
128f0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
12900 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
12910 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b  age, iFreePage);
12920 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
12940 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
12950 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
12960 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
12970 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
12980 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
12990 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
129a0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
129b0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
129c0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
129d0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
129e0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
129f0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
12a00 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
12a10 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
12a20 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
12a30 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
12a40 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
12a50 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
12a60 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
12a70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
12a80 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
12a90 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
12aa0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
12ab0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
12ac0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
12ad0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
12ae0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
12af0 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
12b00 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12b10 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
12b20 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
12b30 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
12b40 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
12b50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
12b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12b70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12b80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
12b90 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
12ba0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
12bb0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
12bc0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
12bd0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l!=0 ){.      rc
12be0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
12bf0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
12c00 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
12c10 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20  reePage);.      
12c20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12c30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
12c40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
12c50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12c60 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
12c70 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
12c80 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
12c90 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
12ca0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
12cb0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
12cc0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
12cd0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
12ce0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
12cf0 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
12d00 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
12d10 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
12d20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
12d30 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
12d40 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
12d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
12d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12d90 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
12da0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
12db0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12dc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12dd0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
12de0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
12df0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
12e00 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
12e10 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
12e20 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
12e30 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
12e40 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
12e50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
12e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
12e80 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
12e90 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
12ea0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
12eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12ec0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
12ed0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
12ee0 79 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  y autoVacuumComm
12ef0 69 74 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  it(). */.static 
12f00 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
12f10 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
12f20 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
12f30 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
12f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12f50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
12f60 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
12f70 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
12f80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
12f90 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
12fa0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12fb0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
12fc0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
12fd0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
12fe0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 6e 54  d *pBt, Pgno *nT
12ff0 72 75 6e 63 29 7b 0a 20 20 50 61 67 65 72 20 2a  runc){.  Pager *
13000 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
13010 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 46 72  ager;.  Pgno nFr
13020 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
13030 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13040 70 61 67 65 73 20 72 65 6d 61 69 6e 69 6e 67 20  pages remaining 
13050 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
13060 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72 4d  . */.  int nPtrM
13070 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
13080 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
13090 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
130a0 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   deallocated */.
130b0 20 20 50 67 6e 6f 20 6f 72 69 67 53 69 7a 65 3b    Pgno origSize;
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130d0 50 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  Pages in the dat
130e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
130f0 50 67 6e 6f 20 66 69 6e 53 69 7a 65 3b 20 20 20  Pgno finSize;   
13100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13110 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
13120 61 73 65 20 66 69 6c 65 20 61 66 74 65 72 20 74  ase file after t
13130 72 75 6e 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  runcation */.  i
13140 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13160 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 38  urn code */.  u8
13170 20 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 70 67   eType;.  int pg
13180 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  sz = pBt->pageSi
13190 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ze;  /* Page siz
131a0 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  e for this datab
131b0 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  ase */.  Pgno iD
131c0 62 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  bPage;          
131d0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
131e0 61 73 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ase page to move
131f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
13200 44 62 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 20  DbMemPage = 0;  
13210 20 2f 2a 20 22 22 20 2a 2f 0a 20 20 50 67 6e 6f   /* "" */.  Pgno
13220 20 69 50 74 72 50 61 67 65 3b 20 20 20 20 20 20   iPtrPage;      
13230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13240 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
13250 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 44   a pointer to iD
13260 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
13270 69 46 72 65 65 50 61 67 65 3b 20 20 20 20 20 20  iFreePage;      
13280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65        /* The fre
13290 65 2d 6c 69 73 74 20 70 61 67 65 20 74 6f 20 6d  e-list page to m
132a0 6f 76 65 20 69 44 62 50 61 67 65 20 74 6f 20 2a  ove iDbPage to *
132b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72  /.  MemPage *pFr
132c0 65 65 4d 65 6d 50 61 67 65 20 3d 20 30 3b 20 2f  eeMemPage = 0; /
132d0 2a 20 22 22 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  * "" */..#ifndef
132e0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52   NDEBUG.  int nR
132f0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
13300 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
13310 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
13320 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
13330 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 50 54  cuum );.  if( PT
13340 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13350 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13360 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 29 20  ecount(pPager)) 
13370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13390 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  T;.  }..  /* Fig
133a0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
133b0 20 66 72 65 65 2d 70 61 67 65 73 20 61 72 65 20   free-pages are 
133c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
133d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
133e0 0a 20 20 2a 2a 20 66 72 65 65 20 70 61 67 65 73  .  ** free pages
133f0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
13400 75 6d 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  um is a no-op.. 
13410 20 2a 2f 0a 20 20 6e 46 72 65 65 4c 69 73 74 20   */.  nFreeList 
13420 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
13430 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
13440 36 5d 29 3b 0a 20 20 69 66 28 20 6e 46 72 65 65  6]);.  if( nFree
13450 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  List==0 ){.    *
13460 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
13470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13480 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
13490 20 62 6c 6f 63 6b 20 66 69 67 75 72 65 73 20 6f   block figures o
134a0 75 74 20 68 6f 77 20 6d 61 6e 79 20 70 61 67 65  ut how many page
134b0 73 20 74 68 65 72 65 20 61 72 65 20 69 6e 20 74  s there are in t
134c0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
134d0 20 6e 6f 77 20 28 76 61 72 69 61 62 6c 65 20 6f   now (variable o
134e0 72 69 67 53 69 7a 65 29 2c 20 61 6e 64 20 68 6f  rigSize), and ho
134f0 77 20 6d 61 6e 79 20 74 68 65 72 65 20 77 69 6c  w many there wil
13500 6c 20 62 65 20 61 66 74 65 72 20 74 68 65 0a 20  l be after the. 
13510 20 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 28   ** truncation (
13520 76 61 72 69 61 62 6c 65 20 66 69 6e 53 69 7a 65  variable finSize
13530 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  )..  **.  ** The
13540 20 66 69 6e 61 6c 20 73 69 7a 65 20 69 73 20 74   final size is t
13550 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  he original size
13560 2c 20 6c 65 73 73 20 74 68 65 20 6e 75 6d 62 65  , less the numbe
13570 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 0a  r of free pages.
13580 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
13590 62 61 73 65 2c 20 6c 65 73 73 20 61 6e 79 20 70  base, less any p
135a0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
135b0 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 20 6c 6f   that will no lo
135c0 6e 67 65 72 0a 20 20 2a 2a 20 62 65 20 72 65 71  nger.  ** be req
135d0 75 69 72 65 64 2c 20 6c 65 73 73 20 31 20 69 66  uired, less 1 if
135e0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
135f0 65 20 70 61 67 65 20 77 61 73 20 70 61 72 74 20  e page was part 
13600 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
13610 20 20 2a 2a 20 62 75 74 20 69 73 20 6e 6f 74 20    ** but is not 
13620 61 66 74 65 72 20 74 68 65 20 74 72 75 6e 63 61  after the trunca
13630 74 69 6f 6e 2e 0a 20 20 2a 2a 2f 0a 20 20 6f 72  tion..  **/.  or
13640 69 67 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  igSize = sqlite3
13650 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13660 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6f 72  Pager);.  if( or
13670 69 67 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  igSize==PENDING_
13680 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
13690 7b 0a 20 20 20 20 6f 72 69 67 53 69 7a 65 2d 2d  {.    origSize--
136a0 3b 0a 20 20 7d 0a 20 20 6e 50 74 72 4d 61 70 20  ;.  }.  nPtrMap 
136b0 3d 20 28 6e 46 72 65 65 4c 69 73 74 2d 6f 72 69  = (nFreeList-ori
136c0 67 53 69 7a 65 2b 50 54 52 4d 41 50 5f 50 41 47  gSize+PTRMAP_PAG
136d0 45 4e 4f 28 70 42 74 2c 20 6f 72 69 67 53 69 7a  ENO(pBt, origSiz
136e0 65 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a  e)+pgsz/5)/(pgsz
136f0 2f 35 29 3b 0a 20 20 66 69 6e 53 69 7a 65 20 3d  /5);.  finSize =
13700 20 6f 72 69 67 53 69 7a 65 20 2d 20 6e 46 72 65   origSize - nFre
13710 65 4c 69 73 74 20 2d 20 6e 50 74 72 4d 61 70 3b  eList - nPtrMap;
13720 0a 20 20 69 66 28 20 6f 72 69 67 53 69 7a 65 3e  .  if( origSize>
13730 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13740 45 28 70 42 74 29 20 26 26 20 66 69 6e 53 69 7a  E(pBt) && finSiz
13750 65 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e<=PENDING_BYTE_
13760 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13770 20 66 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a   finSize--;.  }.
13780 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
13790 49 53 50 41 47 45 28 70 42 74 2c 20 66 69 6e 53  ISPAGE(pBt, finS
137a0 69 7a 65 29 20 7c 7c 20 66 69 6e 53 69 7a 65 3d  ize) || finSize=
137b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
137c0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 66  GE(pBt) ){.    f
137d0 69 6e 53 69 7a 65 2d 2d 3b 0a 20 20 7d 0a 20 20  inSize--;.  }.  
137e0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
137f0 55 4d 3a 20 42 65 67 69 6e 20 28 64 62 20 73 69  UM: Begin (db si
13800 7a 65 20 25 64 2d 3e 25 64 29 5c 6e 22 2c 20 6f  ze %d->%d)\n", o
13810 72 69 67 53 69 7a 65 2c 20 66 69 6e 53 69 7a 65  rigSize, finSize
13820 29 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  ));..  /* Variab
13830 6c 65 20 27 66 69 6e 53 69 7a 65 27 20 77 69 6c  le 'finSize' wil
13840 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66  l be the size of
13850 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70 61 67   the file in pag
13860 65 73 20 61 66 74 65 72 0a 20 20 2a 2a 20 74 68  es after.  ** th
13870 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 68 61  e auto-vacuum ha
13880 73 20 63 6f 6d 70 6c 65 74 65 64 20 28 74 68 65  s completed (the
13890 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 73 69   current file si
138a0 7a 65 20 6d 69 6e 75 73 20 74 68 65 20 6e 75 6d  ze minus the num
138b0 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  ber.  ** of page
138c0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
138d0 73 74 29 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  st). Loop throug
138e0 68 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  h the pages that
138f0 20 6c 69 65 20 62 65 79 6f 6e 64 0a 20 20 2a 2a   lie beyond.  **
13900 20 74 68 69 73 20 6d 61 72 6b 2c 20 61 6e 64 20   this mark, and 
13910 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  if they are not 
13920 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66  already on the f
13930 72 65 65 20 6c 69 73 74 2c 20 6d 6f 76 65 20 74  ree list, move t
13940 68 65 6d 0a 20 20 2a 2a 20 74 6f 20 61 20 66 72  hem.  ** to a fr
13950 65 65 20 70 61 67 65 20 65 61 72 6c 69 65 72 20  ee page earlier 
13960 69 6e 20 74 68 65 20 66 69 6c 65 20 28 73 6f 6d  in the file (som
13970 65 77 68 65 72 65 20 62 65 66 6f 72 65 20 66 69  ewhere before fi
13980 6e 53 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 66  nSize)..  */.  f
13990 6f 72 28 20 69 44 62 50 61 67 65 3d 66 69 6e 53  or( iDbPage=finS
139a0 69 7a 65 2b 31 3b 20 69 44 62 50 61 67 65 3c 3d  ize+1; iDbPage<=
139b0 6f 72 69 67 53 69 7a 65 3b 20 69 44 62 50 61 67  origSize; iDbPag
139c0 65 2b 2b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  e++ ){.    /* If
139d0 20 69 44 62 50 61 67 65 20 69 73 20 61 20 70 6f   iDbPage is a po
139e0 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 2c 20  inter map page, 
139f0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
13a00 79 74 65 20 70 61 67 65 2c 20 73 6b 69 70 20 69  yte page, skip i
13a10 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 50 54  t. */.    if( PT
13a20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13a30 20 69 44 62 50 61 67 65 29 20 7c 7c 20 69 44 62   iDbPage) || iDb
13a40 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
13a50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
13a60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13a70 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
13a80 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
13a90 44 62 50 61 67 65 2c 20 26 65 54 79 70 65 2c 20  DbPage, &eType, 
13aa0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
13ab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13ac0 4b 20 29 20 67 6f 74 6f 20 61 75 74 6f 76 61 63  K ) goto autovac
13ad0 75 75 6d 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28  uum_out;.    if(
13ae0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
13af0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
13b00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
13b10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
13b20 20 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d   goto autovacuum
13b30 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
13b40 20 2f 2a 20 49 66 20 69 44 62 50 61 67 65 20 69   /* If iDbPage i
13b50 73 20 66 72 65 65 2c 20 64 6f 20 6e 6f 74 20 73  s free, do not s
13b60 77 61 70 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20  wap it.  */.    
13b70 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
13b80 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
13b90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13ba0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
13bb0 50 61 67 65 28 70 42 74 2c 20 69 44 62 50 61 67  Page(pBt, iDbPag
13bc0 65 2c 20 26 70 44 62 4d 65 6d 50 61 67 65 2c 20  e, &pDbMemPage, 
13bd0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
13be0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
13bf0 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74 3b   autovacuum_out;
13c00 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
13c10 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
13c20 68 65 20 66 72 65 65 2d 6c 69 73 74 20 74 68 61  he free-list tha
13c30 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
13c40 20 61 74 20 74 68 65 20 65 6e 64 20 0a 20 20 20   at the end .   
13c50 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 2e   ** of the file.
13c60 20 41 20 70 61 67 65 20 63 61 6e 20 62 65 20 70   A page can be p
13c70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
13c80 65 65 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ee list using th
13c90 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  e .    ** alloca
13ca0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 72 6f  teBtreePage() ro
13cb0 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
13cc0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
13cd0 70 46 72 65 65 4d 65 6d 50 61 67 65 20 29 7b 0a  pFreeMemPage ){.
13ce0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13cf0 61 67 65 28 70 46 72 65 65 4d 65 6d 50 61 67 65  age(pFreeMemPage
13d00 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  );.        pFree
13d10 4d 65 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  MemPage = 0;.   
13d20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
13d30 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
13d40 65 28 70 42 74 2c 20 26 70 46 72 65 65 4d 65 6d  e(pBt, &pFreeMem
13d50 50 61 67 65 2c 20 26 69 46 72 65 65 50 61 67 65  Page, &iFreePage
13d60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
13d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13d80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
13d90 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
13da0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ge);.        got
13db0 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
13dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13dd0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 61 67  assert( iFreePag
13de0 65 3c 3d 6f 72 69 67 53 69 7a 65 20 29 3b 0a 20  e<=origSize );. 
13df0 20 20 20 7d 77 68 69 6c 65 28 20 69 46 72 65 65     }while( iFree
13e00 50 61 67 65 3e 66 69 6e 53 69 7a 65 20 29 3b 0a  Page>finSize );.
13e10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13e20 70 46 72 65 65 4d 65 6d 50 61 67 65 29 3b 0a 20  pFreeMemPage);. 
13e30 20 20 20 70 46 72 65 65 4d 65 6d 50 61 67 65 20     pFreeMemPage 
13e40 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6c  = 0;..    /* Rel
13e50 6f 63 61 74 65 20 74 68 65 20 70 61 67 65 20 69  ocate the page i
13e60 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
13e70 74 68 65 20 66 69 6c 65 2e 20 4e 6f 74 65 20 74  the file. Note t
13e80 68 61 74 20 61 6c 74 68 6f 75 67 68 20 74 68 65  hat although the
13e90 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 68 61   .    ** page ha
13ea0 73 20 6d 6f 76 65 64 20 77 69 74 68 69 6e 20 74  s moved within t
13eb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13ec0 2c 20 74 68 65 20 70 44 62 4d 65 6d 50 61 67 65  , the pDbMemPage
13ed0 20 70 6f 69 6e 74 65 72 20 0a 20 20 20 20 2a 2a   pointer .    **
13ee0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 20   remains valid. 
13ef0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13f00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
13f10 6e 20 72 75 6e 20 77 69 74 68 6f 75 74 0a 20 20  n run without.  
13f20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 69 6e    ** invalidatin
13f30 67 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  g cursors open o
13f40 6e 20 74 68 65 20 62 74 72 65 65 2e 20 54 68 69  n the btree. Thi
13f50 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
13f60 6e 20 0a 20 20 20 20 2a 2a 20 73 68 61 72 65 64  n .    ** shared
13f70 2d 63 61 63 68 65 20 6d 6f 64 65 2e 0a 20 20 20  -cache mode..   
13f80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 6c   */.    rc = rel
13f90 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
13fa0 44 62 4d 65 6d 50 61 67 65 2c 20 65 54 79 70 65  DbMemPage, eType
13fb0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
13fc0 65 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  ePage);.    rele
13fd0 61 73 65 50 61 67 65 28 70 44 62 4d 65 6d 50 61  asePage(pDbMemPa
13fe0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
13ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
14000 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f 75 74  o autovacuum_out
14010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
14020 65 6e 74 69 72 65 20 66 72 65 65 2d 6c 69 73 74  entire free-list
14030 20 68 61 73 20 62 65 65 6e 20 73 77 61 70 70 65   has been swappe
14040 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  d to the end of 
14050 74 68 65 20 66 69 6c 65 2e 20 53 6f 0a 20 20 2a  the file. So.  *
14060 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  * truncate the d
14070 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
14080 66 69 6e 53 69 7a 65 20 70 61 67 65 73 20 61 6e  finSize pages an
14090 64 20 63 6f 6e 73 69 64 65 72 20 74 68 65 0a 20  d consider the. 
140a0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 65 6d   ** free-list em
140b0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  pty..  */.  rc =
140c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
140d0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
140e0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
140f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14100 67 6f 74 6f 20 61 75 74 6f 76 61 63 75 75 6d 5f  goto autovacuum_
14110 6f 75 74 3b 0a 20 20 70 75 74 34 62 79 74 65 28  out;.  put4byte(
14120 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
14130 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 70  ata[32], 0);.  p
14140 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
14150 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
14160 20 30 29 3b 0a 20 20 2a 6e 54 72 75 6e 63 20 3d   0);.  *nTrunc =
14170 20 66 69 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65   finSize;.  asse
14180 72 74 28 20 66 69 6e 53 69 7a 65 21 3d 50 45 4e  rt( finSize!=PEN
14190 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
141a0 42 74 29 20 29 3b 0a 0a 61 75 74 6f 76 61 63 75  Bt) );..autovacu
141b0 75 6d 5f 6f 75 74 3a 0a 20 20 61 73 73 65 72 74  um_out:.  assert
141c0 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
141d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
141e0 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 72 63  ger) );.  if( rc
141f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14200 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14210 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14230 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14240 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
14250 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
14260 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
14270 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
14280 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
14290 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
142a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
142b0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
142c0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
142d0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
142e0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
142f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14300 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
14310 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
14320 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14330 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
14340 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
14350 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
14360 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
14370 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
14380 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
14390 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
143a0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
143b0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
143c0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
143d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
143e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
143f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
14400 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14410 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14420 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
14430 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
14440 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
14450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14460 61 67 65 72 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  agerCommit(pBt->
14470 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
14480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14490 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
144a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
144b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
144c0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
144d0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
144e0 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
144f0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
14500 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
14510 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
14520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
14530 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
14540 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
14550 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
14560 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
14570 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14580 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
14590 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
145a0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
145b0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
145c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
145d0 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
145e0 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
145f0 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
14600 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14610 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
14620 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
14630 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
14640 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
14650 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
14660 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14670 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
14680 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14690 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
146a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
146b0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
146c0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
146d0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
146e0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
146f0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
14700 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
14710 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
14720 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
14730 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
14740 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
14750 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
14760 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
14770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14780 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
14790 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
147a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
147b0 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
147c0 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
147d0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
147e0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
147f0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
14800 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
14810 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
14820 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
14830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
14840 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
14850 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
14860 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
14870 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
14880 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
14890 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
148a0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
148b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
148c0 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a 20 20  rFlag ) r++; .  
148d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
148e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
148f0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
14900 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14910 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
14920 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e 67 20  Print debugging 
14930 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
14940 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 6f  t all cursors to
14950 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
14960 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14970 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74  3BtreeCursorList
14980 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
14990 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
149a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
149b0 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28 70 43  p->pBt;.  for(pC
149c0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
149d0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
149e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4d 65  ->pNext){.    Me
149f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
14a00 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
14a10 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 70 43  char *zMode = pC
14a20 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22 72 77  ur->wrFlag ? "rw
14a30 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20 73 71  " : "ro";.    sq
14a40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
14a50 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f 6f 74  ("CURSOR %p root
14a60 65 64 20 61 74 20 25 34 64 28 25 73 29 20 63 75  ed at %4d(%s) cu
14a70 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e 25 64  rrently at %d.%d
14a80 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %s\n",.       pC
14a90 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ur, pCur->pgnoRo
14aa0 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20 20  ot, zMode,.     
14ab0 20 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d    pPage ? pPage-
14ac0 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75 72 2d  >pgno : 0, pCur-
14ad0 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28 70 43  >idx,.       (pC
14ae0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
14af0 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22 20 3a  OR_VALID) ? "" :
14b00 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b 0a 20   " eof".    );. 
14b10 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
14b20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
14b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
14b40 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
14b50 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
14b60 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
14b70 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
14b80 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
14b90 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
14ba0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
14bb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14bc0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
14bd0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
14be0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
14bf0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
14c00 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
14c10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14c20 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
14c30 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
14c40 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
14c50 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
14c60 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
14c70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
14c80 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
14c90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
14ca0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14cb0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
14cc0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72 63 20   *pPage1;..  rc 
14cd0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
14ce0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
14cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14d00 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14d20 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
14d30 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
14d40 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
14d50 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
14d60 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  r occured whilst
14d70 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
14d80 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
14d90 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
14da0 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
14db0 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
14dc0 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
14dd0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
14de0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
14df0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
14e00 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
14e10 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
14e20 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
14e30 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
14e40 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
14e50 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
14e60 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
14e70 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
14e80 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
14e90 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
14ea0 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
14eb0 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
14ec0 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
14ed0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
14ee0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
14ef0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 43    while( pBt->pC
14f00 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 73  ursor ){.      s
14f10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
14f20 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65  ->pCursor->pBtre
14f30 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
14f40 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
14f50 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f 72 74      sqlite3Abort
14f60 4f 74 68 65 72 41 63 74 69 76 65 56 64 62 65 73  OtherActiveVdbes
14f70 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
14f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14f90 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
14fa0 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
14fb0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
14fc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
14fd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
14fe0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
14ff0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
15000 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
15010 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
15020 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
15030 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
15040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15050 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
15060 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
15070 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
15080 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
15090 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
150a0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
150b0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
150c0 20 20 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61 67    ** call getPag
150d0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
150e0 61 69 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ain to make sure
150f0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
15100 73 0a 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72  s.    ** set cor
15110 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
15120 66 28 20 67 65 74 50 61 67 65 28 70 42 74 2c 20  f( getPage(pBt, 
15130 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
15140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15150 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15160 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
15170 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
15180 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
15190 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
151a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
151b0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
151c0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
151d0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
151e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
151f0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
15200 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   );.    pBt->nTr
15210 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
15220 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
15230 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
15240 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
15250 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
15260 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
15270 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
15280 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d  ANS_NONE;.  pBt-
15290 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75  >inStmt = 0;.  u
152a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
152b0 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
152c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
152d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
152e0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
152f0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
15300 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74  ction.  The subt
15310 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a  ransaction can.*
15320 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
15330 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
15340 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
15350 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59  ransaction..** Y
15360 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
15370 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
15380 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
15390 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  btransaction..**
153a0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
153b0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
153c0 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68  omatically if th
153d0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
153e0 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72  on.** commits or
153f0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
15400 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74  ** Only one subt
15410 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
15420 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69  e active at a ti
15430 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  me.  It is an er
15440 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f  ror to try.** to
15450 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62   start a new sub
15460 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61  transaction if a
15470 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61  nother subtransa
15480 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
15490 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53   active..**.** S
154a0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
154b0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
154c0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
154d0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
154e0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
154f0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
15500 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
15510 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
15520 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
15530 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
15540 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
15550 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
15560 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
15570 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
15580 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
15590 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
155a0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
155b0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
155c0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
155d0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
155e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
155f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15600 70 42 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69  pBt;.  if( (p->i
15610 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
15620 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53  ITE) || pBt->inS
15630 74 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  tmt ){.    retur
15640 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
15650 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
15660 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
15670 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15680 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
15690 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
156a0 29 3b 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  );.  rc = pBt->r
156b0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
156c0 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67  _OK : sqlite3Pag
156d0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d  erStmtBegin(pBt-
156e0 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d  >pPager);.  pBt-
156f0 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72  >inStmt = 1;.  r
15700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15710 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
15720 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
15730 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
15740 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
15750 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
15760 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
15770 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
15780 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
15790 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
157a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
157b0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
157c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
157d0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
157e0 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
157f0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
15800 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
15810 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  Commit(pBt->pPag
15820 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
15830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15840 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53  ;.  }.  pBt->inS
15850 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  tmt = 0;.  retur
15860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
15870 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69  ollback the acti
15880 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  ve statement sub
15890 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
158a0 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69   no subtransacti
158b0 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20  on.** is active 
158c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
158d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
158e0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
158f0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  be invalidated b
15900 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
15910 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a  .  Any attempt.*
15920 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  * to use a curso
15930 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  r that was open 
15940 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
15950 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
15960 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c  on.** will resul
15970 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
15980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15990 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42  eeRollbackStmt(B
159a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
159b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
159c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
159d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
159e0 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
159f0 77 28 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  w();.  if( pBt->
15a00 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
15a10 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
15a20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15a30 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42  rStmtRollback(pB
15a40 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
15a50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
15a60 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
15a70 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
15a80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
15a90 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c  sqlite3MallocAll
15aa0 6f 77 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ow();.  return r
15ab0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  c;.}../*.** Defa
15ac0 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  ult key comparis
15ad0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  on function to b
15ae0 65 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d  e used if no com
15af0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
15b00 0a 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64  .** is specified
15b10 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42   on the sqlite3B
15b20 74 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c  treeCursor() cal
15b30 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
15b40 20 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20   dfltCompare(.  
15b50 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20  void *NotUsed,  
15b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
15b70 65 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75  er data is not u
15b80 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c  sed */.  int n1,
15b90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c   const void *p1,
15ba0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79      /* First key
15bb0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
15bc0 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76   int n2, const v
15bd0 6f 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53  oid *p2     /* S
15be0 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d  econd key to com
15bf0 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pare */.){.  int
15c00 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70   c;.  c = memcmp
15c10 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f  (p1, p2, n1<n2 ?
15c20 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28   n1 : n2);.  if(
15c30 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d   c==0 ){.    c =
15c40 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20   n1 - n2;.  }.  
15c50 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
15c60 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
15c70 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
15c80 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
15c90 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
15ca0 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61  * iTable.  The a
15cb0 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20  ct of acquiring 
15cc0 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20  a cursor gets a 
15cd0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  read lock on .**
15ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15cf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  le..**.** If wrF
15d00 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
15d10 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
15d20 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
15d30 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
15d40 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
15d50 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
15d60 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
15d70 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
15d80 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
15d90 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
15da0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
15db0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
15dc0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
15dd0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
15de0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
15df0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
15e00 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
15e10 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
15e20 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
15e30 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
15e40 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
15e50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15e60 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
15e70 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
15e80 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
15e90 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
15ea0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
15eb0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
15ec0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
15ed0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
15ee0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
15ef0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
15f00 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
15f10 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
15f20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
15f30 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
15f40 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
15f50 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
15f60 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
15f70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15f80 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
15f90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
15fa0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
15fb0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
15fc0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
15fd0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
15fe0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
15ff0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
16000 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
16010 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
16020 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
16030 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
16040 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
16050 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
16060 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
16070 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
16080 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
16090 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ectly..**.** The
160a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
160b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67  tion must be log
160c0 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  ically the same 
160d0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
160e0 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75  .** on a particu
160f0 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e  lar table.  Chan
16100 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  ging the compari
16110 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  son function wil
16120 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69  l result.** in i
16130 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69  ncorrect operati
16140 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ons.  If the com
16150 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16160 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64   is NULL, a.** d
16170 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f  efault compariso
16180 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  n function is us
16190 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69  ed.  The compari
161a0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  son function is.
161b0 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65  ** always ignore
161c0 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  d for INTKEY tab
161d0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
161e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
161f0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
16230 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16260 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
16270 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
16280 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
162b0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
162c0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28  -only */.  int (
162d0 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74  *xCmp)(void*,int
162e0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
162f0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f  ,const void*), /
16300 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e  * Key Comparison
16310 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20   func */.  void 
16320 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16350 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
16360 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
16370 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20  **ppCur         
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
163a0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
163b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
163c0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
163d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
163e0 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75  p->pBt;..  *ppCu
163f0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46  r = 0;.  if( wrF
16400 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  lag ){.    if( p
16410 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
16420 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16430 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16440 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
16450 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
16460 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
16470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16480 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
16490 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
164a0 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
164b0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
164c0 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
164d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
164e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
164f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
16500 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61   pCur = sqliteMa
16510 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
16520 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
16530 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  r==0 ){.    rc =
16540 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16550 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
16560 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
16570 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e  .  }.  pCur->pgn
16580 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
16590 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62  able;.  if( iTab
165a0 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  le==1 && sqlite3
165b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
165c0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29  Bt->pPager)==0 )
165d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
165e0 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74  E_EMPTY;.    got
165f0 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
16600 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
16610 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
16620 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
16630 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
16640 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  >pPage, 0);.  if
16650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16660 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
16670 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
16680 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
16690 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
166a0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
166b0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
166c0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
166d0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
166e0 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
166f0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
16700 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
16710 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
16720 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
16730 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
16740 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
16750 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d  ->xCompare = xCm
16760 70 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43  p ? xCmp : dfltC
16770 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e  ompare;.  pCur->
16780 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70  pArg = pArg;.  p
16790 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
167a0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
167b0 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
167c0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
167d0 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
167e0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
167f0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
16800 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
16810 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
16820 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
16830 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
16840 4e 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72  NVALID;.  *ppCur
16850 20 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75   = pCur;..  retu
16860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72  rn SQLITE_OK;.cr
16870 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
16880 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75  ption:.  if( pCu
16890 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  r ){.    release
168a0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
168b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
168c0 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75  e(pCur);.  }.  u
168d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
168e0 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
168f0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 20 20  n rc;.}..#if 0  
16900 2f 2a 20 4e 6f 74 20 55 73 65 64 20 2a 2f 0a 2f  /* Not Used */./
16910 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16920 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d  value of the com
16930 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16940 20 75 73 65 64 20 62 79 20 61 20 63 75 72 73 6f   used by a curso
16950 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
16960 65 33 42 74 72 65 65 53 65 74 43 6f 6d 70 61 72  e3BtreeSetCompar
16970 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  e(.  BtCursor *p
16980 43 75 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Cur,     /* The 
16990 63 75 72 73 6f 72 20 74 6f 20 77 68 6f 73 65 20  cursor to whose 
169a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
169b0 69 6f 6e 20 69 73 20 63 68 61 6e 67 65 64 20 2a  ion is changed *
169c0 2f 0a 20 20 69 6e 74 28 2a 78 43 6d 70 29 28 76  /.  int(*xCmp)(v
169d0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
169e0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
169f0 6f 69 64 2a 29 2c 20 2f 2a 20 4e 65 77 20 63 6f  oid*), /* New co
16a00 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
16a10 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
16a20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16a30 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6d 70  argument to xCmp
16a40 28 29 20 2a 2f 0a 29 7b 0a 20 20 70 43 75 72 2d  () */.){.  pCur-
16a50 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
16a60 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
16a70 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
16a80 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 23 65  Arg = pArg;.}.#e
16a90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
16aa0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
16ab0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
16ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16ad0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
16ae0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
16af0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
16b00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16b10 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
16b20 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
16b30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16b40 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
16b50 42 74 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72 43  Bt;.  restoreOrC
16b60 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
16b70 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 69  on(pCur, 0);.  i
16b80 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
16b90 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65  {.    pCur->pPre
16ba0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
16bb0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
16bc0 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
16bd0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
16be0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
16bf0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
16c00 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
16c10 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
16c20 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
16c30 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
16c40 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
16c50 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 73 71  nused(pBt);.  sq
16c60 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a  liteFree(pCur);.
16c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
16c90 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
16ca0 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20  rsor by filling 
16cb0 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  in the fields of
16cc0 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68   pTempCur..** Th
16cd0 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  e temporary curs
16ce0 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  or is not on the
16cf0 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72   cursor list for
16d00 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 73   the Btree..*/.s
16d10 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 54 65  tatic void getTe
16d20 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
16d30 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
16d40 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
16d50 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
16d60 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70   pCur, sizeof(*p
16d70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  Cur));.  pTempCu
16d80 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
16d90 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
16da0 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70  = 0;.  if( pTemp
16db0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
16dc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
16dd0 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  f(pTempCur->pPag
16de0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
16df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
16e00 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
16e10 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
16e20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
16e30 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
16e40 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
16e50 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
16e60 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d   void releaseTem
16e70 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
16e80 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
16e90 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
16ea0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
16eb0 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
16ec0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
16ed0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
16ee0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  e the BtCursor.i
16ef0 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65  nfo field of the
16f00 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73   given cursor is
16f10 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74   valid..** If it
16f20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16f30 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73  valid, call pars
16f40 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
16f50 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
16f60 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
16f70 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
16f80 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
16f90 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
16fa0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
16fb0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
16fc0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
16fd0 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f   parseCell()..*/
16fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
16ff0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
17000 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
17010 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
17020 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65  ==0 ){.    parse
17030 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
17040 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
17050 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
17060 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
17070 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  UG.    CellInfo 
17080 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
17090 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
170a0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61  f(info));.    pa
170b0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
170c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
170d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
170e0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
170f0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
17100 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
17110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
17120 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
17130 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
17140 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
17150 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
17160 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
17170 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
17180 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
17190 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
171a0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
171b0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
171c0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
171d0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
171e0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
171f0 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
17200 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
17210 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
17220 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
17230 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
17240 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
17250 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
17260 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
17270 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
17280 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
17290 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
172a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c  orPosition(pCur,
172b0 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   1);.  if( rc==S
172c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
172d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
172e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
172f0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
17300 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17310 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
17320 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17330 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
17340 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
17350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17360 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
17370 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
17380 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
17390 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
173a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
173b0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
173c0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
173d0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
173e0 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
173f0 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
17400 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
17410 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
17420 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
17430 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
17440 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
17450 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
17460 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
17470 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
17480 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
17490 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
174a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
174b0 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
174c0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
174d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
174e0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
174f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
17500 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
17510 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
17520 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
17530 6f 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69  on(pCur, 1);.  i
17540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17550 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17560 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17570 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
17580 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
17590 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
175a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
175b0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
175c0 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  ID ){.      /* N
175d0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
175e0 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73   valid entry - s
175f0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20  et *pSize to 0. 
17600 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  */.      *pSize 
17610 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
17620 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
17630 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
17640 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
17650 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a  fo.nData;.    }.
17660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
17680 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
17690 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
176a0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
176b0 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 70 6f 69  cursor is.** poi
176c0 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65 67 69 6e  nting to.  Begin
176d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 79   reading the pay
176e0 6c 6f 61 64 20 61 74 20 22 6f 66 66 73 65 74 22  load at "offset"
176f0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 61 20 74   and read.** a t
17700 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
17710 74 65 73 2e 20 20 50 75 74 20 74 68 65 20 72 65  tes.  Put the re
17720 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e 0a 2a 2a  sult in zBuf..**
17730 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17740 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
17750 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
17760 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
17770 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
17780 61 64 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  ads bytes from t
17790 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
177a0 20 20 44 61 74 61 20 6d 69 67 68 74 20 61 70 70    Data might app
177b0 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 61  ear.** on the ma
177c0 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
177d0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
177e0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
177f0 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
17800 63 20 69 6e 74 20 67 65 74 50 61 79 6c 6f 61 64  c int getPayload
17810 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
17820 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
17830 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
17840 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
17850 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  m */.  int offse
17860 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
17870 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
17880 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
17890 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  ad */.  int amt,
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
178b0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
178c0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
178d0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
178e0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
178f0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
17900 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
17910 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
17920 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
17930 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
17940 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
17950 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
17960 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e 6f 20 6e  ayload;.  Pgno n
17970 65 78 74 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  extPage;.  int r
17980 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
17990 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
179a0 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  *pBt;.  int ovfl
179b0 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Size;.  u32 nKey
179c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
179d0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  r!=0 && pCur->pP
179e0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
179f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
17a00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
17a10 3b 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e  ;.  pBt = pCur->
17a20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 70  pBtree->pBt;.  p
17a30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
17a40 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ge;.  assert( pC
17a50 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
17a60 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
17a70 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
17a80 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
17a90 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
17aa0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
17ab0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
17ac0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
17ad0 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
17ae0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
17af0 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e     nKey = pCur->
17b00 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
17b10 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
17b20 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 6b 69 70  =0 );.  if( skip
17b30 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  Key ){.    offse
17b40 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  t += nKey;.  }. 
17b50 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
17b60 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
17b70 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 72  o.nData ){.    r
17b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17b90 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  OR;.  }.  if( of
17ba0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
17bb0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
17bc0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
17bd0 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
17be0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
17bf0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
17c00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
17c10 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
17c20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 61   memcpy(pBuf, &a
17c30 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
17c40 20 61 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d   a);.    if( a==
17c50 61 6d 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  amt ){.      ret
17c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17c70 20 20 20 7d 0a 20 20 20 20 6f 66 66 73 65 74 20     }.    offset 
17c80 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
17c90 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
17ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
17cb0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
17cc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
17cd0 20 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74    ovflSize = pBt
17ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
17cf0 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
17d00 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
17d10 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
17d20 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
17d30 6f 63 61 6c 5d 29 3b 0a 20 20 20 20 77 68 69 6c  ocal]);.    whil
17d40 65 28 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  e( amt>0 && next
17d50 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 44 62  Page ){.      Db
17d60 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
17d70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17d80 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
17d90 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
17da0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
17db0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
17dc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17dd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17de0 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
17df0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
17e00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
17e10 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
17e20 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
17e30 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 6f      if( offset<o
17e40 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
17e50 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
17e60 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
17e70 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
17e80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
17e90 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
17ea0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
17eb0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
17ec0 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64 5b 6f  Buf, &aPayload[o
17ed0 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b 0a 20 20  ffset+4], a);.  
17ee0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
17ef0 3b 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  ;.        amt -=
17f00 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
17f10 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 65 6c   += a;.      }el
17f20 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  se{.        offs
17f30 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
17f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17f50 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
17f60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
17f70 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30    }..  if( amt>0
17f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17f90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17fa0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
17fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17fc0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
17fd0 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
17fe0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
17ff0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
18000 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
18010 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
18020 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
18030 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
18040 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
18050 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
18060 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18070 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
18080 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
18090 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
180a0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
180b0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
180c0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
180d0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
180e0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
180f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18100 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
18110 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
18120 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
18130 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
18140 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
18150 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
18160 6e 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 69 66  n(pCur, 1);.  if
18170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18190 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
181a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
181b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
181c0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
181d0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
181e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
181f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18200 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18210 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
18220 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
18230 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
18240 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
18250 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
18260 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18270 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
18280 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18290 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
182a0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
182b0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
182c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
182d0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
182e0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
182f0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
18300 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
18310 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
18320 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
18330 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
18340 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
18350 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
18360 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18370 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18380 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
18390 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
183a0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
183b0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
183c0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
183d0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
183e0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
183f0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
18400 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
18410 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
18420 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
18430 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
18440 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Buf){.  int rc =
18450 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
18460 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
18470 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63  ur, 1);.  if( rc
18480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18490 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
184a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
184b0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
184c0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
184d0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
184e0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
184f0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
18500 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
18510 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  );.    rc = getP
18520 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
18530 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
18540 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
18550 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18560 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18570 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
18580 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
18590 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
185a0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
185b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
185c0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
185d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
185e0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
185f0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
18600 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
18610 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
18620 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
18630 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
18640 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
18650 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
18660 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
18670 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
18680 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
18690 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
186a0 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
186b0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
186c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
186d0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
186e0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
186f0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
18700 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
18710 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
18720 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
18730 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
18740 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
18750 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
18760 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
18770 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
18780 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
18790 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
187a0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
187b0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
187c0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
187d0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
187e0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
187f0 6e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20 6d  n getPayload() m
18800 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
18810 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
18820 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
18830 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
18840 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
18850 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
18860 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
18870 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
18880 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
18890 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
188a0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
188b0 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
188c0 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
188d0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
188e0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
188f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
18910 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18920 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
18930 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
18940 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
18950 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
18960 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
18970 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
18980 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18990 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
189a0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
189b0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
189c0 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
189d0 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
189e0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
189f0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
18a00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18a10 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
18a20 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
18a30 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
18a40 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
18a50 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
18a60 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ->pPage!=0 );.  
18a70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
18a80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
18a90 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
18aa0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
18ab0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
18ac0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
18ad0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
18ae0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
18af0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
18b00 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
18b10 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
18b20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
18b30 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
18b40 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
18b50 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
18b60 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
18b70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
18b80 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
18b90 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
18ba0 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
18bb0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
18bc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
18bd0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
18be0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
18bf0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
18c00 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
18c10 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
18c20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
18c30 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
18c40 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
18c50 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
18c60 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
18c70 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
18c80 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
18c90 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
18ca0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
18cb0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
18cc0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
18cd0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
18ce0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
18cf0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
18d00 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
18d10 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
18d20 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
18d30 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
18d40 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
18d50 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
18d60 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
18d70 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
18d80 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2e  y Btree routine.
18d90 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
18da0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
18db0 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
18dc0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
18dd0 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
18de0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
18df0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
18e00 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
18e10 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
18e20 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
18e30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
18e40 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66 28 20  t *pAmt){.  if( 
18e50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18e60 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
18e70 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
18e80 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
18e90 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
18ea0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18eb0 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
18ec0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
18ed0 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
18ee0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
18ef0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
18f00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18f10 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
18f20 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
18f30 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
18f40 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
18f50 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
18f60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
18f70 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
18f80 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
18f90 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
18fa0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
18fb0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
18fc0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
18fd0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
18fe0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
18ff0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
19000 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
19010 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
19020 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
19030 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64  .  MemPage *pOld
19040 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
19050 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
19060 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  tree->pBt;..  as
19070 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19080 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19090 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
190a0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
190b0 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
190c0 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
190d0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
190e0 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
190f0 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
19100 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
19110 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19120 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
19130 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
19140 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
19150 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
19160 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
19170 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
19180 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
19190 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
191a0 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
191b0 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
191c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
191d0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
191e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
191f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
19200 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
19210 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
19220 74 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a  t of its table..
19230 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61  **.** The virtua
19240 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74  l root page is t
19250 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72  he root page for
19260 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42   most tables.  B
19270 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  ut.** for the ta
19280 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61  ble rooted on pa
19290 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74  ge 1, sometime t
192a0 68 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67  he real root pag
192b0 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78  e.** is empty ex
192c0 63 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67  cept for the rig
192d0 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20  ht-pointer.  In 
192e0 73 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a  such cases the.*
192f0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
19300 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20  age is the page 
19310 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70  that the right-p
19320 6f 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a  ointer of page.*
19330 2a 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  * 1 is pointing 
19340 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
19350 74 20 69 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  t isRootPage(Mem
19360 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
19370 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
19380 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
19390 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
193a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
193b0 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70    if( pParent->p
193c0 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30  gno>1 ) return 0
193d0 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65  ;.  if( get2byte
193e0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
193f0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
19400 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74  set+3])==0 ) ret
19410 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
19420 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
19430 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
19440 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
19450 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
19460 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
19470 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
19480 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
19490 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
194a0 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
194b0 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
194c0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
194d0 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
194e0 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
194f0 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
19500 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
19510 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
19520 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
19530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
19540 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
19550 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19560 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
19570 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19580 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
19590 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  t;..  assert( pC
195a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
195b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50  OR_VALID );.  pP
195c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
195d0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
195e0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
195f0 74 28 20 21 69 73 52 6f 6f 74 50 61 67 65 28 70  t( !isRootPage(p
19600 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19610 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19620 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
19630 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
19640 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
19650 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
19660 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
19670 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19680 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19690 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
196a0 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
196b0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
196c0 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
196d0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
196e0 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
196f0 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
19700 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
19710 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
19720 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
19730 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
19740 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
19750 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
19760 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
19770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19780 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19790 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
197a0 70 42 74 3b 0a 0a 20 20 72 65 73 74 6f 72 65 4f  pBt;..  restoreO
197b0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
197c0 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b 0a 20  tion(pCur, 0);. 
197d0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
197e0 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
197f0 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  t && pRoot->pgno
19800 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
19810 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19820 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b  pRoot->isInit );
19830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
19840 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
19850 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
19860 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
19870 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
19880 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b  Root, 0)).    ){
19890 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
198a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
198b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
198c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
198d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
198e0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
198f0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f  Cur->pPage = pRo
19900 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ot;.  }.  pCur->
19910 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  idx = 0;.  pCur-
19920 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
19930 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
19940 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
19950 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
19960 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
19970 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
19980 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
19990 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
199a0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
199b0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
199c0 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
199d0 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
199e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
199f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
19a00 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
19a10 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
19a20 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
19a30 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
19a40 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
19a50 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
19a60 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
19a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19a80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19a90 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
19aa0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
19ab0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
19ac0 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
19ad0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
19ae0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
19af0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
19b00 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
19b10 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
19b20 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
19b30 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
19b40 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
19b50 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
19b60 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
19b70 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
19b80 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pgno;.  int rc;.
19b90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19ba0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
19bb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19bc0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
19bd0 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
19be0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
19bf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19c00 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
19c10 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
19c20 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
19c30 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
19c40 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
19c50 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72  ur->idx));.    r
19c60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
19c70 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
19c80 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19c90 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
19ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19cb0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19cc0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
19cd0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
19ce0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
19cf0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
19d00 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
19d10 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
19d20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
19d30 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
19d40 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
19d50 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
19d60 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
19d70 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
19d80 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
19d90 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
19da0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
19db0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
19dc0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
19dd0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
19de0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
19df0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
19e00 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
19e10 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
19e20 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
19e30 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
19e40 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
19e50 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
19e60 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
19e70 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
19e80 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
19e90 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
19ea0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19eb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
19ec0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19ed0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
19ee0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
19ef0 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
19f00 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
19f10 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
19f20 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
19f30 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
19f40 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65  Cur->idx = pPage
19f50 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
19f60 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
19f70 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
19f80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19f90 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
19fa0 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
19fb0 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69  l - 1;.  pCur->i
19fc0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
19fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19fe0 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  K;.}../* Move th
19ff0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1a000 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1a010 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1a020 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1a030 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1a040 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1a050 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1a060 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1a070 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1a080 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1a090 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1a0a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a0b0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
1a0c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1a0d0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1a0e0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1a0f0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1a100 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a110 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a120 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1a130 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
1a140 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1a150 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
1a160 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1a170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a180 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1a190 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1a1a0 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  >0 );.  *pRes = 
1a1b0 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  0;.  rc = moveTo
1a1c0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1a1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a1e0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a1f0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
1a200 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1a210 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1a220 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1a230 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1a240 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1a250 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1a260 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1a270 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1a280 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1a290 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1a2a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
1a2b0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1a2c0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1a2d0 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
1a2e0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1a2f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1a300 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 43 55  urn rc;.  if( CU
1a310 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1a320 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1a330 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1a350 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
1a360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a370 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1a380 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a390 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a3a0 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
1a3b0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69  .  rc = moveToRi
1a3c0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1a3d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a3e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a3f0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
1a400 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
1a410 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a  near pKey/nKey..
1a420 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63 63  ** Return a succ
1a430 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
1a440 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
1a450 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  s, only the nKey
1a460 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
1a470 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
1a480 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74  ignored.  For ot
1a490 68 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79  her tables, nKey
1a4a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4b0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 0a  f bytes of data.
1a4c0 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20 54 68 65  ** in pKey.  The
1a4d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1a4e0 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 77  tion specified w
1a4f0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77  hen the cursor w
1a500 61 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 73  as.** created is
1a510 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
1a520 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
1a530 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1a540 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1a550 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1a560 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1a570 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1a580 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1a590 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1a5a0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1a5b0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1a5c0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1a5d0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1a5e0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1a5f0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1a600 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1a610 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1a620 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1a630 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1a640 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1a650 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1a660 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1a670 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1a680 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1a690 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1a6a0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1a6b0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1a6c0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1a6d0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1a6e0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1a6f0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1a700 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1a710 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1a720 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1a730 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1a740 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1a750 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1a760 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1a770 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1a780 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1a790 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1a7a0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1a7b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a7c0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1a7d0 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1a7e0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1a7f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1a800 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1a810 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1a820 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1a830 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1a840 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  n pKey..*/.int s
1a850 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1a860 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1a870 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1a880 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 69 6e  ey, i64 nKey, in
1a890 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1a8a0 72 63 3b 0a 20 20 69 6e 74 20 74 72 79 52 69 67  rc;.  int tryRig
1a8b0 68 74 6d 6f 73 74 3b 0a 20 20 72 63 20 3d 20 6d  htmost;.  rc = m
1a8c0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1a8d0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1a8e0 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
1a8f0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
1a900 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a910 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1a920 0a 20 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20  .  tryRightmost 
1a930 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
1a940 6e 74 4b 65 79 3b 0a 20 20 69 66 28 20 70 43 75  ntKey;.  if( pCu
1a950 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a960 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1a970 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1a980 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1a990 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
1a9a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a9b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f  ITE_OK;.  }.  fo
1a9c0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
1a9d0 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
1a9e0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
1a9f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1aa00 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1aa10 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
1aa20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
1aa30 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
1aa40 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
1aa50 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
1aa60 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
1aa70 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  1;.    if( !pPag
1aa80 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65  e->intKey && pKe
1aa90 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
1aaa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1aab0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1aac0 20 20 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d      while( lwr<=
1aad0 75 70 72 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  upr ){.      voi
1aae0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
1aaf0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
1ab00 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1ab10 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
1ab20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1ab30 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1ab40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1ab50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Key ){.        u
1ab60 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
1ab70 20 20 69 66 28 20 74 72 79 52 69 67 68 74 6d 6f    if( tryRightmo
1ab80 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1ab90 70 43 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b  pCur->idx = upr;
1aba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1abb0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
1abc0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1abd0 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63  >idx) + pPage->c
1abe0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
1abf0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1ac00 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
1ac10 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
1ac20 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
1ac30 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
1ac40 43 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  Cell, &dummy);. 
1ac50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ac60 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
1ac70 2c 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b  , (u64 *)&nCellK
1ac80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
1ac90 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29   nCellKey<nKey )
1aca0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1acb0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1acc0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e  e if( nCellKey>n
1acd0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1ace0 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
1acf0 20 20 20 74 72 79 52 69 67 68 74 6d 6f 73 74 20     tryRightmost 
1ad00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1ad10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20  se{.          c 
1ad20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1ad30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ad40 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c      int availabl
1ad50 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e;.        pCell
1ad60 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65  Key = (void *)fe
1ad70 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1ad80 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b   &available, 0);
1ad90 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65  .        nCellKe
1ada0 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
1adb0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1adc0 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
1add0 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
1ade0 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d    c = pCur->xCom
1adf0 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c  pare(pCur->pArg,
1ae00 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c   nCellKey, pCell
1ae10 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29  Key, nKey, pKey)
1ae20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ae30 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1ae40 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
1ae50 6f 63 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20  ocRaw( nCellKey 
1ae60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ae70 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72   pCellKey==0 ) r
1ae80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1ae90 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  EM;.          rc
1aea0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1aeb0 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ey(pCur, 0, nCel
1aec0 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43  lKey, (void *)pC
1aed0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1aee0 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f     c = pCur->xCo
1aef0 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67  mpare(pCur->pArg
1af00 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  , nCellKey, pCel
1af10 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  lKey, nKey, pKey
1af20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1af30 69 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79  iteFree(pCellKey
1af40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1af50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1af60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1af70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
1af80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1af90 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1afa0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
1afb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
1afc0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  r = pCur->idx;. 
1afd0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
1afe0 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
1aff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b010 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1b020 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
1b030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b040 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
1b050 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b060 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
1b070 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31  wr = pCur->idx+1
1b080 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b090 20 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75         upr = pCu
1b0a0 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20  r->idx-1;.      
1b0b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1b0c0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
1b0d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1b0e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1b0f0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1b100 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
1b110 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
1b120 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
1b130 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
1b140 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1b150 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1b160 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1b170 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
1b180 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1b190 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1b1a0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
1b1b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
1b1c0 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
1b1d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b1e0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
1b1f0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
1b200 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
1b210 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1b220 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75   = c;.      retu
1b230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b240 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1b250 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75  x = lwr;.    pCu
1b260 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1b270 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
1b280 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
1b290 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
1b2a0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1b2b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1b2c0 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44    /* NOT REACHED
1b2d0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   */.}../*.** Ret
1b2e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1b2f0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1b300 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1b310 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
1b320 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
1b330 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
1b340 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
1b350 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
1b360 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
1b370 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1b380 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
1b390 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
1b3a0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
1b3b0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
1b3c0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
1b3d0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
1b3e0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1b3f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b400 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
1b410 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
1b420 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
1b430 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
1b440 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
1b450 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
1b460 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
1b470 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
1b480 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
1b490 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
1b4a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
1b4b0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
1b4c0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
1b4d0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
1b4e0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
1b4f0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
1b500 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
1b510 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1b520 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
1b530 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1b540 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1b550 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1b560 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1b570 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1b580 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1b590 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1b5a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b5b0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1b5c0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1b5d0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1b5e0 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1b5f0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
1b600 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1b610 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1b620 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
1b630 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53  Page;..#ifndef S
1b640 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1b650 44 5f 43 41 43 48 45 0a 20 20 72 63 20 3d 20 72  D_CACHE.  rc = r
1b660 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
1b670 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1b680 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 1);.  if( rc!=
1b690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1b6b0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1b6c0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
1b6d0 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1b6e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1b6f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b700 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1b710 3d 20 30 3b 0a 23 65 6e 64 69 66 20 0a 0a 20 20  = 0;.#endif ..  
1b720 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
1b730 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1b740 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1b750 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1b760 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1b770 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1b780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b790 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
1b7a0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1b7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1b7c0 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
1b7d0 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
1b7e0 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e  >idx++;.  pCur->
1b7f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1b800 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e    if( pCur->idx>
1b810 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
1b820 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1b830 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1b840 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1b850 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
1b860 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b870 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b880 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
1b890 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b8a0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1b8b0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1b8c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1b8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b8e0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
1b8f0 20 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50       if( isRootP
1b900 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1b910 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1b920 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1b930 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1b940 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1b950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b970 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
1b980 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
1b990 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1b9a0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
1b9b0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1b9c0 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
1b9d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
1b9e0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b 0a  ge->leafData ){.
1b9f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ba00 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
1ba10 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
1ba20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1ba30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ba40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ba50 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
1ba60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
1ba70 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
1ba80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ba90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1baa0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
1bab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bac0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
1bad0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
1bae0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
1baf0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1bb00 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1bb10 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1bb20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1bb30 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1bb40 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1bb50 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1bb60 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1bb70 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
1bb80 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
1bb90 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
1bba0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
1bbb0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1bbc0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
1bbd0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1bbe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
1bbf0 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65   pgno;.  MemPage
1bc00 20 2a 70 50 61 67 65 3b 0a 0a 23 69 66 6e 64 65   *pPage;..#ifnde
1bc10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1bc20 41 52 45 44 5f 43 41 43 48 45 0a 20 20 72 63 20  ARED_CACHE.  rc 
1bc30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
1bc40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1bc50 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  Cur, 1);.  if( r
1bc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bc70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bc80 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1bc90 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
1bca0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1bcb0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1bcc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bcd0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1bce0 69 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ip = 0;.#endif..
1bcf0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1bd00 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1bd10 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1bd20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1bd30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1bd40 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1bd50 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
1bd60 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1bd70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1bd80 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66  ->idx>=0 );.  if
1bd90 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1bda0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
1bdb0 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28  4byte( findCell(
1bdc0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
1bdd0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ) );.    rc = mo
1bde0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1bdf0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1be00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1be10 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1be20 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1be30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
1be40 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20  e( pCur->idx==0 
1be50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52  ){.      if( isR
1be60 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1be70 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1be80 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1be90 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1bea0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1beb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bec0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1bed0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
1bee0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1bef0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1bf00 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  e;.    }.    pCu
1bf10 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43  r->idx--;.    pC
1bf20 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1bf30 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1bf40 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21  e->leafData && !
1bf50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1bf60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bf70 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1bf80 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1bf90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1bfa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1bfb0 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
1bfc0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1bfd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1bfe0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
1bff0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1c000 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
1c010 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
1c020 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
1c030 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
1c040 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c050 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
1c060 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
1c070 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
1c080 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
1c090 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
1c0a0 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
1c0b0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
1c0c0 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
1c0d0 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
1c0e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c0f0 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
1c100 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
1c110 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
1c120 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c130 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
1c140 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
1c150 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
1c160 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
1c170 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
1c180 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
1c190 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
1c1a0 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
1c1b0 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
1c1c0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1c1d0 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
1c1e0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
1c1f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
1c200 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
1c210 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
1c220 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
1c230 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
1c240 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
1c250 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
1c260 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
1c270 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
1c280 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
1c290 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
1c2a0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
1c2b0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
1c2c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c2d0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
1c2e0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
1c2f0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
1c300 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
1c310 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
1c320 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
1c330 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
1c340 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
1c350 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
1c360 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
1c370 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
1c380 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
1c390 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
1c3a0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
1c3b0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1c3c0 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
1c3d0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
1c3e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c3f0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1c400 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1c410 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
1c420 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
1c430 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
1c440 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
1c450 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
1c460 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
1c470 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  rc;.  int n;    
1c480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c490 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1c4a0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20  ist */.  int k; 
1c4b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c4c0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
1c4d0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
1c4e0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
1c4f0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
1c500 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
1c510 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 70 50 61  runk = 0;..  pPa
1c520 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1c530 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  1;.  n = get4byt
1c540 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1c550 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30  [36]);.  if( n>0
1c560 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
1c570 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
1c580 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
1c590 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
1c5a0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
1c5b0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
1c5c0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
1c5d0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
1c5e0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
1c5f0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
1c600 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
1c610 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
1c620 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
1c630 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
1c640 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
1c650 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
1c660 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
1c670 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
1c680 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1c690 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
1c6a0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
1c6b0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
1c6c0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
1c6d0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
1c6e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1c6f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1c700 20 65 78 61 63 74 20 29 7b 0a 20 20 20 20 20 20   exact ){.      
1c710 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1c720 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1c730 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c740 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1c750 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1c760 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1c770 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1c780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1c790 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c7a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1c7b0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1c7c0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1c7d0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1c7e0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1c7f0 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1c800 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1c810 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1c820 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1c830 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1c840 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1c850 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1c860 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1c870 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1c880 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1c890 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1c8a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c8b0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1c8c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1c8d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
1c8e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1c8f0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
1c900 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
1c910 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
1c920 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
1c930 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
1c940 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
1c950 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
1c960 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
1c970 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
1c980 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
1c990 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
1c9a0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
1c9b0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1c9c0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
1c9d0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
1c9e0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1c9f0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
1ca00 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
1ca10 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1ca20 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
1ca30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
1ca40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ca50 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1ca60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1ca70 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
1ca80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1ca90 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 54   getPage(pBt, iT
1caa0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
1cab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1cac0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
1cad0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
1cae0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1caf0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
1cb00 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
1cb10 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1cb20 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
1cb30 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
1cb40 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1cb50 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
1cb60 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
1cb70 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
1cb80 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
1cb90 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
1cba0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
1cbb0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
1cbc0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
1cbd0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
1cbe0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
1cbf0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1cc00 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
1cc10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1cc20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1cc30 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1cc40 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1cc50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1cc60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1cc70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1cc80 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
1cc90 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
1cca0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1ccb0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1ccc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1ccd0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
1cce0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1ccf0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1cd00 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1cd10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1cd20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1cd30 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1cd40 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
1cd50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
1cd60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1cd70 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 20  4 - 8 ){.       
1cd80 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
1cd90 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
1cda0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
1cdb0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1cdc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1cdd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1cde0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1cdf0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
1ce00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ce10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
1ce20 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
1ce30 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
1ce40 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1ce50 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
1ce60 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
1ce70 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
1ce80 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
1ce90 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
1cea0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
1ceb0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
1cec0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
1ced0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
1cee0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
1cef0 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
1cf00 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1cf10 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
1cf20 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
1cf30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cf40 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1cf50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1cf60 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1cf70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1cf80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1cf90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cfa0 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
1cfb0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1cfc0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1cfd0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1cfe0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1cff0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1d000 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1d010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d020 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d030 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1d040 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1d050 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1d060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d080 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
1d090 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
1d0a0 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
1d0b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
1d0c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
1d0d0 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
1d0e0 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
1d0f0 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
1d100 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
1d110 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
1d120 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
1d130 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
1d140 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
1d150 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
1d160 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
1d170 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1d180 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
1d190 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
1d1a0 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
1d1b0 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
1d1c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1d1f0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1d200 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
1d210 20 20 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 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
1d240 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d270 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1d280 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1d290 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1d2a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1d2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d2c0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1d2d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1d2e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1d2f0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1d300 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
1d310 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1d320 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1d330 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1d340 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
1d350 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
1d360 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
1d370 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d380 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1d390 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1d3a0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1d3b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d3c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1d3d0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1d3e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d410 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
1d420 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1d430 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
1d450 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1d460 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
1d470 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1d480 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
1d490 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
1d4a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1d4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d4c0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1d4d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1d4e0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1d4f0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1d500 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1d510 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1d520 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1d530 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
1d540 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
1d550 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
1d560 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73          int clos
1d570 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
1d580 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
1d590 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1d5a0 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
1d5b0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72  aData;.        r
1d5c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d5d0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1d5e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1d5f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d600 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d610 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1d620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1d630 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
1d640 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64          int i, d
1d650 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
1d660 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1d670 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
1d680 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
1d690 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1d6a0 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
1d6b0 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
1d6c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1d6d0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
1d6e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
1d6f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1d700 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
1d710 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
1d720 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
1d730 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
1d740 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
1d750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1d760 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
1d770 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1d780 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
1d790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1d7a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d7b0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1d7c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1d7d0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
1d7e0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1d7f0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
1d800 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
1d810 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
1d820 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
1d830 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
1d840 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
1d850 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65  f( *pPgno>sqlite
1d860 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1d870 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1d880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d890 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65  ree page off the
1d8a0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1d8b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1d8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d8d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1d8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d8f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1d900 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
1d910 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
1d920 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
1d930 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
1d940 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
1d950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d960 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
1d970 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
1d980 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
1d990 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
1d9a0 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
1d9b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
1d9c0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1d9d0 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
1d9e0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1d9f0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1da00 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
1da10 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  -1);.          r
1da20 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1da30 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
1da40 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
1da50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1da60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1da70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1da80 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1da90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1daa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1dab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dac0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1dad0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1daf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1db00 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1db10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1db20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
1db30 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1db40 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
1db50 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
1db60 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
1db70 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
1db80 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1db90 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
1dba0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
1dbb0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
1dbc0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
1dbd0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
1dbe0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c      *pPgno = sql
1dbf0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1dc00 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1dc10 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
1dc20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1dc30 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1dc40 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1dc50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1dc60 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
1dc70 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
1dc80 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
1dc90 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
1dca0 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
1dcb0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
1dcc0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1dcd0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
1dce0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
1dcf0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
1dd00 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
1dd10 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
1dd20 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
1dd30 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
1dd40 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
1dd50 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
1dd60 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
1dd70 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
1dd80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1dd90 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
1dda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1ddb0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1ddc0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1ddd0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1dde0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ddf0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1de00 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1de10 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1de20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1de30 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1de40 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1de50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1de60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1de70 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1de80 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1de90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1deb0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1dec0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
1ded0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1dee0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1def0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
1df00 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1df10 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1df20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1df30 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
1df40 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
1df50 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1df60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1df70 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  evTrunk);.  retu
1df80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1df90 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68  Add a page of th
1dfa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dfb0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1dfc0 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  .**.** sqlite3Pa
1dfd0 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f  gerUnref() is NO
1dfe0 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61  T called for pPa
1dff0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1e000 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
1e010 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74  ge *pPage){.  Bt
1e020 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1e030 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  age->pBt;.  MemP
1e040 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1e050 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  t->pPage1;.  int
1e060 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a   rc, n, k;..  /*
1e070 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67   Prepare the pag
1e080 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f  e for freeing */
1e090 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e0a0 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50  ->pgno>1 );.  pP
1e0b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
1e0c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1e0d0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  Page->pParent);.
1e0e0 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
1e0f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72   = 0;..  /* Incr
1e100 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
1e110 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
1e120 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
1e130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e140 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e150 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1e160 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65  urn rc;.  n = ge
1e170 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e180 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
1e190 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e1a0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b  aData[36], n+1);
1e1b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e1c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1e1d0 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  /* If the SQLITE
1e1e0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63  _SECURE_DELETE c
1e1f0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
1e200 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
1e210 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20  hen.  ** always 
1e220 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
1e230 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
1e240 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
1e250 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1e260 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1e270 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1e280 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e290 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50   rc;.  memset(pP
1e2a0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
1e2b0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
1e2c0 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  ize);.#endif..#i
1e2d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e2e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1e2f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1e300 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
1e310 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
1e320 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
1e330 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
1e340 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1e350 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
1e360 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1e370 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1e380 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
1e390 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70  ut(pBt, pPage->p
1e3a0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  gno, PTRMAP_FREE
1e3b0 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
1e3c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e3d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e3e0 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
1e3f0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
1e400 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a  irst free page *
1e410 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1e420 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1e430 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1e440 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e450 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74  n rc;.    memset
1e460 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1e470 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 8);.    put4by
1e480 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e490 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
1e4a0 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28  no);.    TRACE((
1e4b0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66  "FREE-PAGE: %d f
1e4c0 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  irst\n", pPage->
1e4d0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
1e4e0 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72  .    /* Other fr
1e4f0 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  ee pages already
1e500 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65   exist.  Retrive
1e510 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
1e520 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20   page.    ** of 
1e530 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
1e540 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61   find out how ma
1e550 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73  ny leaves it has
1e560 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
1e570 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63   *pTrunk;.    rc
1e580 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
1e590 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1e5a0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70  ->aData[32]), &p
1e5b0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
1e5c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e5d0 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62  c;.    k = get4b
1e5e0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1e5f0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
1e600 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k>=pBt->usableSi
1e610 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
1e620 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69    /* The trunk i
1e630 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68  s full.  Turn th
1e640 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
1e650 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20  ed into a new.  
1e660 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67      ** trunk pag
1e670 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73  e with no leaves
1e680 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
1e690 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e6a0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1e6b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e6c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e6d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1e6e0 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b  e->aData, pTrunk
1e6f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  ->pgno);.      p
1e700 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1e710 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
1e720 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e730 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e740 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
1e750 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
1e760 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
1e770 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
1e780 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ing %d\n",.     
1e790 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
1e7a0 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
1e7b0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1e7c0 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  .      /* Add th
1e7d0 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61  e newly freed pa
1e7e0 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20  ge as a leaf on 
1e7f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e  the current trun
1e800 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
1e810 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e820 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1e830 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1e840 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1e850 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
1e860 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1e870 6b 2b 31 29 3b 0a 20 20 20 20 20 20 70 75 74 34  k+1);.      put4
1e880 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1e890 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67  ata[8+k*4], pPag
1e8a0 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  e->pgno);.#ifnde
1e8b0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1e8c0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 73 71 6c  DELETE.      sql
1e8d0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
1e8e0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  te(pBt->pPager, 
1e8f0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 65  pPage->pgno);.#e
1e900 6e 64 69 66 0a 20 20 20 20 20 20 54 52 41 43 45  ndif.      TRACE
1e910 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
1e920 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
1e930 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
1e940 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
1e950 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
1e960 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
1e970 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nk);.  }.  retur
1e980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
1e990 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
1e9a0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
1e9b0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
1e9c0 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
1e9d0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
1e9e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
1e9f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
1ea00 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
1ea10 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1ea20 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
1ea30 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
1ea40 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
1ea50 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69    int nOvfl;.  i
1ea60 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  nt ovflPageSize;
1ea70 0a 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  ..  parseCellPtr
1ea80 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1ea90 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
1eaa0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
1eab0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1eac0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
1ead0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
1eae0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1eaf0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
1eb00 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
1eb10 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
1eb20 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
1eb30 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
1eb40 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1eb50 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
1eb60 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
1eb70 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
1eb80 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
1eb90 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
1eba0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
1ebb0 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
1ebc0 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
1ebd0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65  Ovfl-- ){.    Me
1ebe0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20  mPage *pOvfl;.  
1ebf0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d    if( ovflPgno==
1ec00 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 73 71  0 || ovflPgno>sq
1ec10 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1ec20 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1ec30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ec40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ec50 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1ec60 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
1ec70 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
1ec80 66 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fl, 0);.    if( 
1ec90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1eca0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
1ecb0 0a 20 20 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  .      ovflPgno 
1ecc0 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c  = get4byte(pOvfl
1ecd0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
1ece0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
1ecf0 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
1ed00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ed10 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
1ed20 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ed30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
1ed40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ed50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1ed60 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
1ed70 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
1ed80 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
1ed90 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
1eda0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
1edb0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
1edc0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
1edd0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
1ede0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
1edf0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
1ee00 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
1ee10 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
1ee20 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1ee30 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
1ee40 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
1ee50 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1ee60 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
1ee70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1ee80 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
1ee90 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
1eea0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1eeb0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
1eec0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
1eed0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
1eee0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
1eef0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
1ef00 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
1ef10 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
1ef20 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
1ef30 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
1ef40 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
1ef50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1ef60 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
1ef70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ef90 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1efa0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
1efb0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
1efc0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
1efd0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
1efe0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
1eff0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
1f000 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
1f010 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
1f020 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
1f030 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
1f040 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
1f050 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
1f060 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
1f070 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
1f080 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
1f090 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
1f0a0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
1f0b0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
1f0c0 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
1f0d0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
1f0e0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
1f0f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
1f100 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
1f110 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
1f120 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
1f130 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
1f140 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1f150 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1f160 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
1f170 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
1f180 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
1f190 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
1f1a0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
1f1b0 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
1f1c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1f1d0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
1f1e0 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
1f1f0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
1f200 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
1f210 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
1f220 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
1f230 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
1f240 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a   nData = 0;.  }.
1f250 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
1f260 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
1f270 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
1f280 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65  nKey);.  parseCe
1f290 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
1f2a0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
1f2b0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
1f2c0 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
1f2d0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
1f2e0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
1f2f0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
1f300 3d 3d 6e 44 61 74 61 20 29 3b 0a 20 20 0a 20 20  ==nData );.  .  
1f310 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
1f320 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
1f330 6c 6f 61 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20  load = nData;.  
1f340 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1f350 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
1f360 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
1f370 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
1f380 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
1f390 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
1f3a0 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20   nKey;.    pSrc 
1f3b0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
1f3c0 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a   = nKey;.  }.  *
1f3d0 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
1f3e0 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
1f3f0 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
1f400 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
1f410 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
1f420 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
1f430 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
1f440 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
1f450 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
1f460 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
1f470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f480 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f490 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
1f4a0 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
1f4b0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
1f4c0 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
1f4d0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e  ntry page */.#en
1f4e0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
1f4f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1f500 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
1f510 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
1f520 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
1f530 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f540 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
1f550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1f560 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
1f570 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
1f580 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
1f590 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
1f5a0 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
1f5b0 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
1f5c0 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
1f5d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1f5e0 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
1f5f0 61 67 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74  age now. The ent
1f600 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
1f610 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77   overflow page w
1f620 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
1f630 61 64 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20  added later, by 
1f640 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
1f650 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20   routine..      
1f660 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1f670 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
1f680 70 67 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26  pgnoPtrmap!=0 &&
1f690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f6a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1f6b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
1f6c0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
1f6d0 56 45 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74  VERFLOW2, pgnoPt
1f6e0 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rmap);.      }.#
1f6f0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
1f700 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1f710 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
1f720 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
1f730 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f740 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
1f750 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
1f760 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
1f770 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
1f780 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
1f790 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
1f7a0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
1f7b0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
1f7c0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
1f7d0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
1f7e0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
1f7f0 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
1f800 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
1f810 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
1f820 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
1f830 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
1f840 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
1f850 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20   spaceLeft;.    
1f860 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
1f870 20 6e 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72   nSrc;.    asser
1f880 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 6d  t( pSrc );.    m
1f890 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1f8a0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 6e 50  pSrc, n);.    nP
1f8b0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
1f8c0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
1f8d0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
1f8e0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
1f8f0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
1f900 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
1f910 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
1f920 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
1f930 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
1f940 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
1f950 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
1f960 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f970 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1f980 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67  hange the MemPag
1f990 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e.pParent pointe
1f9a0 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68  r on the page wh
1f9b0 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ose number is.**
1f9c0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
1f9d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f  cond argument so
1f9e0 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50   that MemPage.pP
1f9f0 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a  arent holds the.
1fa00 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
1fa10 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
1fa20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fa30 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53  reparentPage(BtS
1fa40 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1fa50 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
1fa60 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20  pNewParent, int 
1fa70 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  idx){.  MemPage 
1fa80 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65  *pThis;.  DbPage
1fa90 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
1faa0 73 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74  sert( pNewParent
1fab0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  !=0 );.  if( pgn
1fac0 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
1fad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1fae0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  t( pBt->pPager!=
1faf0 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  0 );.  pDbPage =
1fb00 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1fb10 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
1fb20 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
1fb30 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68  bPage ){.    pTh
1fb40 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  is = (MemPage *)
1fb50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
1fb60 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
1fb70 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73     if( pThis->is
1fb80 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Init ){.      as
1fb90 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61  sert( pThis->aDa
1fba0 74 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65  ta==(sqlite3Page
1fbb0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1fbc0 29 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  )) );.      if( 
1fbd0 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d  pThis->pParent!=
1fbe0 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20  pNewParent ){.  
1fbf0 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
1fc00 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74  >pParent ) sqlit
1fc10 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68  e3PagerUnref(pTh
1fc20 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62  is->pParent->pDb
1fc30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1fc40 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20  This->pParent = 
1fc50 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  pNewParent;.    
1fc60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1fc70 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e  Ref(pNewParent->
1fc80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fc90 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69  }.      pThis->i
1fca0 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a  dxParent = idx;.
1fcb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1fcc0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
1fcd0 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  age);.  }..#ifnd
1fce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1fcf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
1fd00 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fd10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74  ){.    return pt
1fd20 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
1fd30 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1fd40 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e   pNewParent->pgn
1fd50 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  o);.  }.#endif. 
1fd60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd70 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  K;.}..../*.** Ch
1fd80 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74  ange the pParent
1fd90 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20   pointer of all 
1fda0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67  children of pPag
1fdb0 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a  e to point back.
1fdc0 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a  ** to pPage..**.
1fdd0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
1fde0 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69  s, for every chi
1fdf0 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76  ld of pPage, inv
1fe00 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65  oke reparentPage
1fe10 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75  ().** to make su
1fe20 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69  re that each chi
1fe30 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50  ld knows that pP
1fe40 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e  age is its paren
1fe50 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
1fe60 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1fe70 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63  d after you memc
1fe80 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e  py() one page in
1fe90 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a  to.** another..*
1fea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
1feb0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
1fec0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1fed0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68  .  int i;.  BtSh
1fee0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1fef0 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e->pBt;.  int rc
1ff00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1ff10 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1ff20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1ff30 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  _OK;..  for(i=0;
1ff40 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
1ff50 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1ff60 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1ff70 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
1ff80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1ff90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  ){.      rc = re
1ffa0 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
1ffb0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
1ffc0 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
1ffd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ffe0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1fff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
20000 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
20010 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
20020 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
20030 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
20040 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
20050 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20  set+8]), .      
20060 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
20070 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
20080 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
20090 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
200a0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
200b0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
200c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
200d0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
200e0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
200f0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
20100 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
20110 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
20120 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
20130 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
20140 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
20150 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
20160 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
20170 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
20180 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
20190 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
201a0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
201b0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
201c0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
201d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
201e0 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
201f0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
20200 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
20210 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
20220 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20230 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
20240 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
20250 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
20260 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
20270 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
20280 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
20290 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
202a0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
202b0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
202c0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
202d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
202e0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
202f0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
20300 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
20310 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
20320 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
20330 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
20340 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
20350 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
20360 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
20370 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
20380 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
20390 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
203a0 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
203b0 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28  (ptr);.  assert(
203c0 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c   pc>10 && pc+sz<
203d0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
203e0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65  bleSize );.  fre
203f0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
20400 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69  , sz);.  for(i=i
20410 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
20420 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
20430 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
20440 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
20450 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
20460 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
20470 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
20480 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
20490 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
204a0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
204b0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
204c0 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
204d0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
204e0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
204f0 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
20500 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
20510 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
20520 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
20530 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
20540 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
20550 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
20560 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
20570 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
20580 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
20590 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
205a0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
205b0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
205c0 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
205d0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
205e0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
205f0 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
20600 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
20610 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
20620 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
20630 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
20640 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
20650 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
20660 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
20670 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
20680 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
20690 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
206a0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
206b0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
206c0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
206d0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
206e0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
206f0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
20700 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
20710 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
20720 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
20730 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
20740 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
20750 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
20760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20770 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
20780 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
20790 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
207a0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
207b0 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
207c0 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
207d0 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
207e0 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
207f0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
20800 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
20810 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
20820 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
20830 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
20840 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
20850 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
20860 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
20870 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
20880 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
20890 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
208a0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
208b0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
208c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
208d0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
208e0 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
208f0 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
20900 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
20910 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
20920 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
20930 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
20940 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
20950 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
20960 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
20970 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
20980 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
20990 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
209a0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
209b0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
209c0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
209d0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
209e0 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
209f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20a00 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
20a10 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
20a20 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
20a30 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
20a40 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
20a50 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
20a60 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
20a70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
20a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20a90 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
20aa0 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
20ab0 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
20ac0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
20ad0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
20ae0 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
20af0 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
20b00 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
20b10 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
20b20 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
20b30 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
20b40 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
20b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20b60 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
20b70 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
20b80 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
20b90 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
20ba0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
20bb0 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
20bc0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
20bd0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
20be0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
20bf0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
20c00 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
20c10 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
20c20 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
20c30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
20c40 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
20c50 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
20c60 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
20c70 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
20c80 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
20c90 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
20ca0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
20cb0 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
20cc0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
20cd0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
20ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
20cf0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
20d00 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
20d10 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  j<sizeof(pPage->
20d20 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
20d30 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29  age->aOvfl[0]) )
20d40 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
20d50 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
20d60 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
20d70 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69  aOvfl[j].idx = i
20d80 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
20d90 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
20da0 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
20db0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64  e->aData;.    hd
20dc0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
20dd0 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20  fset;.    top = 
20de0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
20df0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+5]);.    cell
20e00 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
20e10 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
20e20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
20e30 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
20e40 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d  l + 2;.    ins =
20e50 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
20e60 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e  i;.    if( end >
20e70 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20   top - sz ){.   
20e80 20 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72     int rc = defr
20e90 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
20ea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
20ec0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f  urn rc;.      to
20ed0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
20ee0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
20ef0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20    assert( end + 
20f00 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20  sz <= top );.   
20f10 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c   }.    idx = all
20f20 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
20f30 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72  , sz);.    asser
20f40 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20  t( idx>0 );.    
20f50 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67  assert( end <= g
20f60 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
20f70 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  r+5]) );.    pPa
20f80 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
20f90 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
20fa0 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   2;.    memcpy(&
20fb0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
20fc0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
20fd0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72  -nSkip);.    for
20fe0 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
20ff0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
21000 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
21010 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
21020 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
21030 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
21040 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
21050 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
21060 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
21070 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
21080 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
21090 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
210a0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
210b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
210c0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
210d0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
210e0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
210f0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
21100 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
21110 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
21120 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
21130 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
21140 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
21150 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
21160 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
21170 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
21180 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
21190 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
211a0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
211b0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  info);.      ass
211c0 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
211d0 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
211e0 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
211f0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
21200 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e        if( (info.
21210 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
21220 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
21230 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
21240 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70  {.        Pgno p
21250 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
21260 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
21270 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
21280 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72      int rc = ptr
21290 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
212a0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
212b0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
212c0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
212d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
212e0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
212f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21300 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
21310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
21330 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
21340 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
21350 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
21360 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
21370 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
21380 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
21390 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
213a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
213b0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
213c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
213d0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
213e0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
213f0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
21400 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
21410 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
21420 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
21430 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
21440 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
21450 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
21460 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65   */.  int *aSize
21470 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
21480 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
21490 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
214a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
214b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
214c0 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
214d0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
214e0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
214f0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
21500 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
21510 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
21520 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
21530 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
21540 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
21550 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
21560 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
21570 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
21580 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
21590 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
215a0 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
215b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
215c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
215d0 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  0 );.  totalSize
215e0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
215f0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
21600 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
21610 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
21620 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
21630 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
21640 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
21650 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
21660 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
21670 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
21680 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
21690 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
216a0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
216b0 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
216c0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
216d0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
216e0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
216f0 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
21700 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
21710 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
21720 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
21730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21740 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
21750 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
21760 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
21770 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
21780 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
21790 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
217a0 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
217b0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
217c0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
217d0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
217e0 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
217f0 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
21800 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
21810 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
21820 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21830 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
21840 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
21850 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
21860 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
21870 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
21880 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
21890 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
218a0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
218b0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
218c0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
218d0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
218e0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
218f0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
21900 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
21910 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
21920 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
21930 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
21940 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
21950 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
21960 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
21970 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
21980 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
21990 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
219a0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
219b0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
219c0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
219d0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
219e0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
219f0 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
21a00 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
21a10 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
21a20 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
21a30 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
21a40 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
21a50 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
21a60 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
21a70 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
21a80 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
21a90 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
21aa0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
21ab0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
21ac0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
21ad0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
21ae0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
21af0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21b00 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
21b10 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
21b20 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
21b30 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
21b40 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
21b50 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
21b60 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
21b70 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
21b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
21b90 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
21ba0 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
21bb0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
21bc0 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
21bd0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
21be0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
21bf0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
21c00 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
21c10 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
21c20 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
21c30 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
21c40 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
21c50 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
21c60 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
21c70 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
21c80 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
21c90 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
21ca0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
21cb0 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
21cc0 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
21cd0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
21ce0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
21cf0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
21d00 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
21d10 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
21d20 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
21d30 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
21d40 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
21d50 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
21d60 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
21d70 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
21d80 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
21d90 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
21da0 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
21db0 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
21dc0 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
21dd0 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
21de0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
21df0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
21e00 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
21e10 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
21e20 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
21e30 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
21e40 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
21e50 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
21e60 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
21e70 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
21e80 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
21e90 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
21ea0 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
21eb0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
21ec0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
21ed0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
21ee0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
21ef0 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
21f00 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
21f10 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
21f20 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
21f30 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
21f40 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b  l;.  int szCell;
21f50 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
21f60 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
21f70 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
21f80 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
21f90 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
21fa0 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
21fb0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
21fc0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
21fd0 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ff0 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
22000 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
22010 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
22040 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
22050 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  l */..  /* Alloc
22060 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
22070 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
22080 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
22090 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
220a0 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
220b0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
220c0 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
220d0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
220e0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
220f0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
22100 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
22110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
22130 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  pCell = pPage
22140 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
22150 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  ;.  szCell = cel
22160 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
22170 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61  pCell);.  zeroPa
22180 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e  ge(pNew, pPage->
22190 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73  aData[0]);.  ass
221a0 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
221b0 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
221c0 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ll);.  pPage->nO
221d0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
221e0 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e  /* Set the paren
221f0 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61  t of the newly a
22200 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f  llocated page to
22210 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70   pParent. */.  p
22220 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
22230 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
22240 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
22250 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
22260 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72  /* pPage is curr
22270 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d  ently the right-
22280 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
22290 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20  . Change this.  
222a0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ** so that the r
222b0 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68  ight-child is th
222c0 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63  e new page alloc
222d0 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20  ated above and. 
222e0 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65   ** pPage is the
222f0 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63   next-to-right c
22300 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  hild. .  */.  as
22310 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
22320 6c 6c 3e 30 20 29 3b 0a 20 20 70 61 72 73 65 43  ll>0 );.  parseC
22330 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69  ellPtr(pPage, fi
22340 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
22350 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26  age->nCell-1), &
22360 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69  info);.  rc = fi
22370 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
22380 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c  , parentCell, 0,
22390 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
223a0 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a  , &parentSize);.
223b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
223c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
223d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
223e0 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36  rt( parentSize<6
223f0 34 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65  4 );.  rc = inse
22400 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
22410 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e  parentIdx, paren
22420 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a  tCell, parentSiz
22430 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20  e, 0, 4);.  if( 
22440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22450 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22460 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66    }.  put4byte(f
22470 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
22480 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64  pParent,parentId
22490 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  x), pPage->pgno)
224a0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
224b0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
224c0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
224d0 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23  8], pgnoNew);..#
224e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
224f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22500 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
22510 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
22520 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
22530 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
22540 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
22550 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
22560 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
22570 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a  r from the .  **
22580 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
22590 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
225a0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
225b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
225c0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
225d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
225e0 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
225f0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
22600 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
22610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22630 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 74 72    }.    rc = ptr
22640 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
22650 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
22660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22670 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22680 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
22690 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
226a0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
226b0 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20  he new page and 
226c0 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
226d0 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e  nt page,.  ** in
226e0 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
226f0 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
22700 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
22710 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
22720 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  */.  releasePage
22730 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
22740 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74   balance(pParent
22750 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  , 0);.}.#endif /
22760 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
22770 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f  ICKBALANCE */../
22780 2a 0a 2a 2a 20 54 68 65 20 49 53 41 55 54 4f 56  *.** The ISAUTOV
22790 41 43 55 55 4d 20 6d 61 63 72 6f 20 69 73 20 75  ACUUM macro is u
227a0 73 65 64 20 77 69 74 68 69 6e 20 62 61 6c 61 6e  sed within balan
227b0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
227c0 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 69 66 20  determine.** if 
227d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
227e0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
227f0 6d 20 6f 72 20 6e 6f 74 2e 20 42 65 63 61 75 73  m or not. Becaus
22800 65 20 69 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  e it is used.** 
22810 77 69 74 68 69 6e 20 61 6e 20 65 78 70 72 65 73  within an expres
22820 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6e 20  sion that is an 
22830 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 6e 6f 74  argument to anot
22840 68 65 72 20 6d 61 63 72 6f 20 0a 2a 2a 20 28 73  her macro .** (s
22850 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 29 2c  qliteMallocRaw),
22860 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
22870 62 6c 65 20 74 6f 20 75 73 65 20 63 6f 6e 64 69  ble to use condi
22880 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69  tional compilati
22890 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68 69 73 20  on..** So, this 
228a0 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
228b0 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 23 69 66   instead..*/.#if
228c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
228d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 23 64 65 66  _AUTOVACUUM.#def
228e0 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d  ine ISAUTOVACUUM
228f0 20 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   (pBt->autoVacuu
22900 6d 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  m).#else.#define
22910 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 30 0a   ISAUTOVACUUM 0.
22920 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
22930 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
22940 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f  tributes Cells o
22950 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
22960 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a  o NN*2 siblings.
22970 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74  ** of pPage so t
22980 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
22990 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d  ve about the sam
229a0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
229b0 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c   space..** Usual
229c0 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  ly NN siblings o
229d0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
229e0 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69   pPage is used i
229f0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
22a00 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20  .** though more 
22a10 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
22a20 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ome from one sid
22a30 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  e if pPage is th
22a40 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61  e first.** or la
22a50 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
22a60 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67  parent.  If pPag
22a70 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  e has fewer than
22a80 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a   2*NN siblings.*
22a90 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  * (something whi
22aa0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
22ab0 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74  en if pPage is t
22ac0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20  he root page or 
22ad0 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72  a .** child of r
22ae0 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  oot) then all av
22af0 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
22b00 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
22b10 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
22b20 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
22b30 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  of siblings of p
22b40 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  Page might be in
22b50 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
22b60 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a  ased by one or.*
22b70 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  * two in an effo
22b80 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
22b90 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
22ba0 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
22bb0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  The root page.**
22bc0 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20   is special and 
22bd0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
22be0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49   nearly empty. I
22bf0 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74  f pPage is .** t
22c00 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  he root page, th
22c10 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  en the depth of 
22c20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62  the tree might b
22c30 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f  e increased.** o
22c40 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
22c50 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79  ne, as necessary
22c60 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f  , to keep the ro
22c70 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  ot page from bei
22c80 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f  ng.** overfull o
22c90 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  r completely emp
22ca0 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ty..**.** Note t
22cb0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
22cc0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
22cd0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c   some of the Cel
22ce0 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d  ls on pPage.** m
22cf0 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
22d00 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
22d10 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20  Page->aData[].  
22d20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
22d30 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
22d40 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72  s overfull.  Par
22d50 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20  t of the job of 
22d60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
22d70 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20  to.** make sure 
22d80 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50  all Cells for pP
22d90 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66  age once again f
22da0 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  it in pPage->aDa
22db0 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ta[]..**.** In t
22dc0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
22dd0 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69  ancing the sibli
22de0 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68  ngs of pPage, th
22df0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
22e00 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d  e.** might becom
22e10 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
22e20 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61  derfull.  If tha
22e30 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20  t happens, then 
22e40 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
22e50 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  is called recurs
22e60 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72  ively on the par
22e70 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ent..**.** If th
22e80 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
22e90 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
22ea0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
22eb0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
22ec0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
22ed0 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69  tate.  So if thi
22ee0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
22ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
22f00 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
22f10 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
22f20 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
22f30 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  nroot(MemPage *p
22f40 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
22f50 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
22f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
22f70 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ent of pPage */.
22f80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
22fb0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
22fc0 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
22fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22fe0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
22ff0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
23000 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
23010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
23020 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
23030 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
23040 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
23050 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
23060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23070 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
23080 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
23090 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
230a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
230b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
230c0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
230d0 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  nDiv;           
230e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
230f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
23100 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pDiv[] */.  int 
23110 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
23120 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23130 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
23140 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
23150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23160 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e  ndex of pPage in
23170 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
23180 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  ] */.  int nxDiv
23190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
231a0 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
231b0 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
231c0 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
231d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231f0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
23200 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43  e */.  int leafC
23210 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
23220 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
23230 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
23240 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
23250 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
23260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23270 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
23280 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
23290 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
232a0 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
232b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
232c0 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
232d0 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
232e0 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23300 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
23310 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
23320 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23340 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
23350 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
23360 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
23370 69 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  iSpace = 0;     
23380 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23390 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
233a0 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d   aSpace[] */.  M
233b0 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
233c0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
233d0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
233e0 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
233f0 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42   Pgno pgnoOld[NB
23400 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
23410 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
23420 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
23430 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pOld[] */.  MemP
23440 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
23450 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
23460 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
23470 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
23480 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
23490 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
234a0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
234b0 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
234c0 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
234d0 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e    Pgno pgnoNew[N
234e0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  B+2];          /
234f0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
23500 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
23510 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20  apNew[] */.  u8 
23520 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20  *apDiv[NB];     
23530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
23540 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
23550 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
23560 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
23570 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23580 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
23590 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
235a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
235b0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
235c0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
235d0 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
235e0 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
235f0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
23600 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
23610 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
23620 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
23630 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c   */.  int *szCel
23640 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
23650 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
23660 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
23670 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
23680 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20  8 *aCopy[NB];   
23690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
236a0 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
236b0 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
236c0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
236d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
236e0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
236f0 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64  hold copies of d
23700 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f  ividers cells */
23710 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23720 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
23730 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b    u8 *aFrom = 0;
23740 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 0a 20  .#endif..  /* . 
23750 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72   ** Find the par
23760 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ent page..  */. 
23770 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
23780 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
23790 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
237a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
237b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
237c0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
237d0 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
237e0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
237f0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
23800 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
23810 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
23820 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
23830 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20  rent->pDbPage)) 
23840 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
23850 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  ;.  }.  TRACE(("
23860 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
23870 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
23880 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
23890 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
238a0 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
238b0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
238c0 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  ALANCE.  /*.  **
238d0 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a   A special case:
238e0 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79    If a new entry
238f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69   has just been i
23900 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20  nserted into a. 
23910 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20   ** table (that 
23920 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68  is, a btree with
23930 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e   integer keys an
23940 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68  d all data at th
23950 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61  e leaves).  ** a
23960 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  nd the new entry
23970 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
23980 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
23990 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65  tree (it has the
239a0 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65  .  ** largest ke
239b0 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  y) then use the 
239c0 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f  special balance_
239d0 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  quick() routine 
239e0 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  for.  ** balanci
239f0 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  ng.  balance_qui
23a00 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73  ck() is much fas
23a10 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20  ter and results 
23a20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a  in a tighter.  *
23a30 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74  * packing of dat
23a40 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  a in the common 
23a50 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
23a60 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a   pPage->leaf &&.
23a70 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
23a80 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61  Key &&.      pPa
23a90 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a  ge->leafData &&.
23aa0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
23ab0 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
23ac0 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
23ad0 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
23ae0 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
23af0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
23b00 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
23b10 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
23b20 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
23b30 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
23b40 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
23b50 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
23b60 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
23b70 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
23b80 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
23b90 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
23ba0 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
23bb0 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
23bc0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
23bd0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
23be0 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
23bf0 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ck(pPage, pParen
23c00 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  t);.  }.#endif..
23c10 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
23c20 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
23c30 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65  arent page whose
23c40 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e   left child poin
23c50 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20  ts back.  ** to 
23c60 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78  pPage.  The "idx
23c70 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  " variable is th
23c80 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
23c90 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a  cell.  If pPage.
23ca0 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68    ** is the righ
23cb0 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  tmost child of p
23cc0 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20  Parent then set 
23cd0 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e  idx to pParent->
23ce0 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66  nCell .  */.  if
23cf0 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
23d00 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ift ){.    Pgno 
23d10 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  pgno;.    pgno =
23d20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20   pPage->pgno;.  
23d30 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d    assert( pgno==
23d40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
23d50 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
23d60 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f  bPage) );.    fo
23d70 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61  r(idx=0; idx<pPa
23d80 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78  rent->nCell; idx
23d90 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67  ++){.      if( g
23da0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
23db0 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d  (pParent, idx))=
23dc0 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  =pgno ){.       
23dd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
23de0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23df0 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ( idx<pParent->n
23e00 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Cell.           
23e10 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70    || get4byte(&p
23e20 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
23e30 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
23e40 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  +8])==pgno );.  
23e50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d  }else{.    idx =
23e60 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
23e70 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  t;.  }..  /*.  *
23e80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72  * Initialize var
23e90 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69  iables so that i
23ea0 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74  t will be safe t
23eb0 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65  o jump.  ** dire
23ec0 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f  ctly to balance_
23ed0 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d  cleanup at any m
23ee0 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  oment..  */.  nO
23ef0 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  ld = nNew = 0;. 
23f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
23f10 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
23f20 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  e);..  /*.  ** F
23f30 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ind sibling page
23f40 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74  s to pPage and t
23f50 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
23f60 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a  ent that divide.
23f70 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
23f80 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69  s.  An attempt i
23f90 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
23fa0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
23fb0 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f  ther.  ** side o
23fc0 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73  f pPage.  More s
23fd0 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
23fe0 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
23ff0 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a   however, if.  *
24000 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72  * pPage there ar
24010 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
24020 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
24030 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20  other side.  If 
24040 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
24050 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
24060 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
24070 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
24080 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20  nt are taken..  
24090 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78  */.  nxDiv = idx
240a0 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44   - NN;.  if( nxD
240b0 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e  iv + NB > pParen
240c0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
240d0 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d  nxDiv = pParent-
240e0 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b  >nCell - NB + 1;
240f0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
24100 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <0 ){.    nxDiv 
24110 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20  = 0;.  }.  nDiv 
24120 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 0;.  for(i=0, 
24130 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69  k=nxDiv; i<NB; i
24140 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, k++){.    if
24150 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ( k<pParent->nCe
24160 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ll ){.      apDi
24170 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
24180 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20  pParent, k);.   
24190 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20     nDiv++;.     
241a0 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e   assert( !pParen
241b0 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20  t->leaf );.     
241c0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
241d0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
241e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
241f0 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  k==pParent->nCel
24200 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  l ){.      pgnoO
24210 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
24220 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
24230 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
24240 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
24250 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
24260 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
24270 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
24280 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20  Bt, pgnoOld[i], 
24290 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65  &apOld[i], pPare
242a0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
242b0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
242c0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c  leanup;.    apOl
242d0 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20  d[i]->idxParent 
242e0 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b  = k;.    apCopy[
242f0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
24300 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
24310 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
24320 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
24330 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
24340 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
24350 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
24360 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
24370 6c 74 69 70 6c 65 20 6f 66 20 32 20 69 6e 20 6f  ltiple of 2 in o
24380 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
24390 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
243a0 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
243b0 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
243c0 6c 73 20 2b 20 31 29 26 7e 31 3b 0a 0a 20 20 2f  ls + 1)&~1;..  /
243d0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
243e0 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
243f0 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
24400 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
24410 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 0a 20 20  teMallocRaw( .  
24420 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
24430 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
24460 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
24470 6c 73 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 20  ls*sizeof(int)  
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
244a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 52 4f 55  ll */.     + ROU
244b0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
244c0 67 65 29 29 2a 4e 42 20 20 20 20 20 20 20 20 20  ge))*NB         
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244e0 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20  aCopy */.     + 
244f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 35  pBt->pageSize*(5
24500 2b 4e 42 29 20 20 20 20 20 20 20 20 20 20 20 20  +NB)            
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24520 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20  /* aSpace */.   
24530 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
24540 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
24550 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0)              
24560 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
24570 20 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c    );.  if( apCel
24580 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
24590 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
245a0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
245b0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
245c0 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61  zCell = (int*)&a
245d0 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
245e0 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28  ;.  aCopy[0] = (
245f0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
24600 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
24610 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28  ( ((aCopy[0] - (
24620 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
24630 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
24640 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
24650 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  red */.  for(i=1
24660 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<NB; i++){.  
24670 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43    aCopy[i] = &aC
24680 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61  opy[i-1][pBt->pa
24690 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
246a0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
246b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61  .    assert( ((a
246c0 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61  Copy[i] - (u8*)a
246d0 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
246e0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
246f0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
24700 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d  /.  }.  aSpace =
24710 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42   &aCopy[NB-1][pB
24720 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
24730 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
24740 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e))];.  assert( 
24750 28 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29  ((aSpace - (u8*)
24760 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
24770 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
24780 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
24790 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
247a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
247b0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
247c0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61  oVacuum ){.    a
247d0 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35  From = &aSpace[5
247e0 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  *pBt->pageSize];
247f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
24800 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f   /*.  ** Make co
24810 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74  pies of the cont
24820 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64  ent of pPage and
24830 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e   its siblings in
24840 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20  to aOld[]..  ** 
24850 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
24860 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
24870 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
24880 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
24890 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
248a0 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
248b0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
248c0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
248d0 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  the.  ** process
248e0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
248f0 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  itten..  */.  fo
24900 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
24910 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
24920 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20   *p = apCopy[i] 
24930 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 43 6f  = (MemPage*)&aCo
24940 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 61 67 65 53  py[i][pBt->pageS
24950 69 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ize];.    p->aDa
24960 74 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d  ta = &((u8*)p)[-
24970 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
24980 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44      memcpy(p->aD
24990 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
249a0 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
249b0 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  ize + sizeof(Mem
249c0 50 61 67 65 29 29 3b 0a 20 20 20 20 2f 2a 20 54  Page));.    /* T
249d0 68 65 20 6d 65 6d 63 70 79 28 29 20 61 62 6f 76  he memcpy() abov
249e0 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
249f0 6c 75 65 20 6f 66 20 70 2d 3e 61 44 61 74 61 20  lue of p->aData 
24a00 73 6f 20 77 65 20 68 61 76 65 20 74 6f 0a 20 20  so we have to.  
24a10 20 20 2a 2a 20 73 65 74 20 69 74 20 61 67 61 69    ** set it agai
24a20 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 44 61  n. */.    p->aDa
24a30 74 61 20 3d 20 26 28 28 75 38 2a 29 70 29 5b 2d  ta = &((u8*)p)[-
24a40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
24a50 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c    }..  /*.  ** L
24a60 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
24a70 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
24a80 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
24a90 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
24aa0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
24ab0 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
24ac0 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
24ad0 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
24ae0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
24af0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
24b00 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e  form aSpace[] an
24b10 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
24b20 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
24b30 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
24b40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
24b50 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
24b60 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
24b70 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
24b80 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
24b90 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
24ba0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
24bb0 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
24bc0 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
24bd0 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
24be0 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73  pace[].  In this
24bf0 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
24c00 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
24c10 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
24c20 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
24c30 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
24c40 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
24c50 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
24c60 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
24c70 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
24c80 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
24c90 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
24ca0 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
24cb0 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
24cc0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
24cd0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
24ce0 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
24cf0 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
24d00 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
24d10 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
24d20 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
24d30 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
24d40 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
24d50 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  /.  nCell = 0;. 
24d60 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
24d70 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b  = pPage->leaf*4;
24d80 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50  .  leafData = pP
24d90 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
24da0 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
24db0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
24dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
24dd0 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
24de0 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69  y[i];.    int li
24df0 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
24e00 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
24e10 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  w;.    for(j=0; 
24e20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
24e30 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
24e40 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
24e50 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
24e60 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
24e70 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
24e80 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
24e90 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
24ea0 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
24eb0 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66  nCell]);.#ifndef
24ec0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24ed0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
24ee0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
24ef0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  m ){.        int
24f00 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f   a;.        aFro
24f10 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20  m[nCell] = i;.  
24f20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61        for(a=0; a
24f30 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  <pOld->nOverflow
24f40 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; a++){.        
24f50 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66    if( pOld->aOvf
24f60 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65  l[a].pCell==apCe
24f70 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20  ll[nCell] ){.   
24f80 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
24f90 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
24fa0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24fb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
24fd0 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c  endif.      nCel
24fe0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  l++;.    }.    i
24ff0 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20  f( i<nOld-1 ){. 
25000 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 63 65       int sz = ce
25010 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
25020 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
25030 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
25040 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
25050 69 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41  ith the LEAFDATA
25060 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63   flag, pParent c
25070 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49  ells hold only I
25080 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20  NTKEYs that.    
25090 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69      ** are dupli
250a0 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e  cates of keys on
250b0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73   the child pages
250c0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65  .  We need to re
250d0 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  move.        ** 
250e0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
250f0 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20  s from pParent, 
25100 62 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73  but the dividers
25110 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20   cells are not. 
25120 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
25130 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61  to apCell[] beca
25140 75 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70  use they are dup
25150 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64  licates of child
25160 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20   cells..        
25170 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  */.        dropC
25180 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
25190 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d  iv, sz);.      }
251a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38  else{.        u8
251b0 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20   *pTemp;.       
251c0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
251d0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
251e0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
251f0 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  ] = sz;.        
25200 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b  pTemp = &aSpace[
25210 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
25220 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
25230 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
25240 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
25250 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
25260 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
25270 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
25280 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
25290 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
252a0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66  fCorrection;.#if
252b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
252c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
252d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
252e0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
252f0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
25300 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
25310 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
25320 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
25330 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
25340 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
25350 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f  nCell] -= leafCo
25360 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
25370 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
25380 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f  te(pTemp)==pgnoO
25390 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20  ld[i] );.       
253a0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
253b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
253c0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
253d0 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tion==0 );.     
253e0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
253f0 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
25400 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
25410 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
25420 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
25430 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
25440 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
25450 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
25460 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70  pCell[nCell], &p
25470 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d  Old->aData[pOld-
25480 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34  >hdrOffset+8], 4
25490 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
254a0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
254b0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
254c0 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
254d0 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c   }.        nCell
254e0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
254f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
25500 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
25510 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
25520 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
25530 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
25540 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
25550 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
25560 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
25570 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
25580 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
25590 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
255a0 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
255b0 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
255c0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
255d0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
255e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
255f0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
25600 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
25610 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
25620 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
25630 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
25640 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
25650 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
25660 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
25670 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
25680 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
25690 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
256a0 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
256b0 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
256c0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
256d0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
256e0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
256f0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
25700 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
25710 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
25720 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
25730 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
25740 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
25750 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
25760 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
25770 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
25780 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
25790 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
257a0 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
257b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
257c0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
257d0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
257e0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
257f0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
25800 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
25810 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
25820 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
25830 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
25840 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
25850 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
25860 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
25870 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
25880 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
25890 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
258a0 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
258b0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
258c0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
258d0 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
258e0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
258f0 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
25900 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
25910 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
25920 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
25930 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
25940 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
25950 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
25960 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
25970 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
25980 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
25990 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
259a0 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
259b0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
259c0 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
259d0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
259e0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
259f0 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
25a00 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
25a10 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
25a20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
25a30 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
25a40 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
25a50 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
25a60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
25a70 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
25a80 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
25a90 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
25aa0 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
25ab0 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
25ac0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
25ad0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
25ae0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
25af0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
25b00 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
25b10 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
25b20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
25b30 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
25b40 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
25b50 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
25b60 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
25b70 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
25b80 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
25b90 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
25ba0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
25bb0 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25bd0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
25be0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
25bf0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
25c00 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
25c10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25c20 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
25c30 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
25c40 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
25c50 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
25c60 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
25c70 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
25c80 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
25c90 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
25ca0 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
25cb0 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
25cc0 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
25cd0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
25ce0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
25cf0 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
25d00 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
25d10 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
25d20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
25d30 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
25d40 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
25d50 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
25d60 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
25d70 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
25d80 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
25d90 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
25da0 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
25db0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
25dc0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
25dd0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
25de0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
25df0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61  w[0])>0) or we a
25e00 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69  re the.  ** a vi
25e10 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
25e20 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
25e30 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
25e40 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
25e50 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
25e60 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
25e70 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
25e80 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
25e90 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
25ea0 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
25eb0 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
25ec0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
25ed0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
25ee0 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
25ef0 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
25f00 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
25f10 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
25f20 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
25f30 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d  );.  pageFlags =
25f40 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
25f50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
25f60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
25f70 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
25f80 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
25f90 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
25fa0 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
25fb0 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
25fc0 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20  = pgnoOld[i];.  
25fd0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
25fe0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
25ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26000 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
26010 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
26020 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26030 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
26040 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
26050 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
26060 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
26070 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
26080 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65  noNew[i], pgnoNe
26090 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20  w[i-1], 0);.    
260a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
260b0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
260c0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
260d0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
260e0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7a 65    nNew++;.    ze
260f0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
26100 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  eFlags);.  }..  
26110 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
26120 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
26130 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
26140 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
26150 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
26160 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
26170 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
26180 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26190 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
261a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
261b0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
261c0 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
261d0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
261e0 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
261f0 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
26200 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
26210 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
26220 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
26230 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
26240 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
26250 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
26260 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
26270 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
26280 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
26290 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
262a0 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
262b0 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
262c0 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
262d0 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
262e0 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
262f0 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
26300 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
26310 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
26320 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
26330 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
26340 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
26350 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
26360 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
26370 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
26380 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
26390 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
263a0 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
263b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
263c0 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
263d0 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
263e0 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
263f0 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
26400 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
26410 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
26420 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  V = pgnoNew[i];.
26430 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
26440 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
26450 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
26460 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d    if( pgnoNew[j]
26470 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
26480 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
26490 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
264a0 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a  V = pgnoNew[j];.
264b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
264c0 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
264d0 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20        int t;.   
264e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
264f0 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65        t = pgnoNe
26500 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d  w[i];.      pT =
26510 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
26520 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
26530 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  noNew[minI];.   
26540 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
26550 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
26560 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d   pgnoNew[minI] =
26570 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b   t;.      apNew[
26580 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
26590 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
265a0 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
265b0 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28   %d %d  new: %d(
265c0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
265d0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
265e0 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  n",.    pgnoOld[
265f0 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  0], .    nOld>=2
26600 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20   ? pgnoOld[1] : 
26610 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
26620 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c   pgnoOld[2] : 0,
26630 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c  .    pgnoNew[0],
26640 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
26650 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77  New>=2 ? pgnoNew
26660 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  [1] : 0, nNew>=2
26670 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
26680 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70  .    nNew>=3 ? p
26690 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e  gnoNew[2] : 0, n
266a0 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
266b0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
266c0 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20  =4 ? pgnoNew[3] 
266d0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
266e0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
266f0 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e   nNew>=5 ? pgnoN
26700 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[4] : 0, nNew>
26710 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
26720 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  0));..  /*.  ** 
26730 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
26740 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
26750 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
26760 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
26770 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
26780 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
26790 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
267a0 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
267b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
267c0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
267d0 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
267e0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
267f0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
26800 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
26810 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
26820 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
26830 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e  ssert( pNew->pgn
26840 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b  o==pgnoNew[i] );
26850 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
26860 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
26870 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
26880 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
26890 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
268a0 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
268b0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
268c0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
268d0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
268e0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64  low==0 );..#ifnd
268f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26900 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a  UTOVACUUM.    /*
26910 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
26920 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
26930 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
26940 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
26950 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ies.    ** that 
26960 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62  point to the sib
26970 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20  lings that were 
26980 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73  rearranged. Thes
26990 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20  e can be: left. 
269a0 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f     ** children o
269b0 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67  f cells, the rig
269c0 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
269d0 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f  page, or overflo
269e0 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70  w pages.    ** p
269f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c  ointed to by cel
26a00 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
26a10 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
26a20 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  um ){.      for(
26a30 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d  k=j; k<cntNew[i]
26a40 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
26a50 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65  assert( k<nMaxCe
26a60 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  lls );.        i
26a70 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46  f( aFrom[k]==0xF
26a80 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
26a90 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[k]]->pgno!=pNe
26aa0 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  w->pgno ){.     
26ab0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
26ac0 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d  PutOvfl(pNew, k-
26ad0 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
26ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
26b00 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26b10 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
26b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26b30 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
26b40 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
26b50 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
26b60 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
26b70 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
26b80 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
26b90 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
26ba0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
26bb0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
26bc0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
26bd0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
26be0 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c  ( i<nNew-1 && j<
26bf0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
26c00 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
26c10 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
26c20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
26c30 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
26c40 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
26c50 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
26c60 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
26c70 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
26c80 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
26c90 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
26ca0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
26cb0 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
26cc0 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
26cd0 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20     pTemp = 0;.  
26ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
26cf0 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a 20 49 66  afData ){../* If
26d00 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
26d10 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
26d20 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
26d30 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
26d40 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
26d50 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
26d60 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
26d70 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
26d80 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
26d90 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
26da0 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
26db0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
26dc0 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
26dd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26de0 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
26df0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
26e00 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
26e10 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
26e20 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
26e30 3b 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43  ;.        parseC
26e40 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
26e50 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
26e60 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
26e70 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
26e80 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
26e90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
26ea0 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
26eb0 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
26ec0 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
26ed0 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
26ee0 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
26ef0 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
26f00 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
26f10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26f20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
26f30 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  4;.        pTemp
26f40 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
26f50 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
26f60 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
26f70 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
26f80 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
26f90 35 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  5 );.      }.   
26fa0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
26fb0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
26fc0 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
26fd0 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
26fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26ff0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
27000 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70  cleanup;.      p
27010 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
27020 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
27030 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
27040 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
27050 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27060 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
27070 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
27080 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
27090 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
270a0 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
270b0 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
270c0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
270d0 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
270e0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
270f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
27100 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
27110 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
27120 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
27130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
27140 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
27150 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
27160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
27170 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
27180 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
27190 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
271a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
271b0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
271c0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
271d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
271e0 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  if.      j++;.  
271f0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
27200 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
27210 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
27220 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
27230 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
27240 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
27250 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
27260 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
27270 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
27280 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70  ]->aData[8], &ap
27290 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
272a0 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a  ata[8], 4);.  }.
272b0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
272c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
272d0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
272e0 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
272f0 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
27300 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
27310 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
27320 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
27330 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
27340 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
27350 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
27360 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
27370 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
27380 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
27390 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
273a0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
273b0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
273c0 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
273d0 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
273e0 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
273f0 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
27400 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
27410 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
27420 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
27430 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
27440 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
27450 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
27460 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
27470 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
27480 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
27490 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  (apNew[i]);.    
274a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
274b0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
274c0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
274d0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
274e0 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29  ldPages(pParent)
274f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27500 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
27510 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  ance_cleanup;.. 
27520 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
27530 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
27540 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
27550 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
27560 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
27570 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
27580 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
27590 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
275a0 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
275b0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
275c0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
275d0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
275e0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
275f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
27600 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
27610 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
27620 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
27630 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
27640 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
27650 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
27660 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46  eanup:.  sqliteF
27670 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
27680 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
27690 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
276a0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
276b0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
276c0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
276d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
276e0 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  New[i]);.  }.  r
276f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65  eleasePage(pPare
27700 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  nt);.  TRACE(("B
27710 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
27720 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64   with %d: old=%d
27730 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
27740 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
27750 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64  Page->pgno, nOld
27760 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
27770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27780 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
27790 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
277a0 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
277b0 6f 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20  of a btree when 
277c0 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
277d0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
277e0 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ls.  This is an 
277f0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d  opportunity to m
27800 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20  ake the tree.** 
27810 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65  shallower by one
27820 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
27830 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68  c int balance_sh
27840 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20  allower(MemPage 
27850 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
27860 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20  ge *pChild;     
27870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
27880 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f  nly child page o
27890 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  f pPage */.  Pgn
278a0 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
278b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
278c0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68  e number for pCh
278d0 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ild */.  int rc 
278e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
278f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27900 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  code from subpro
27910 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53  cedures */.  BtS
27920 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27940 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73  The main BTree s
27950 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
27960 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b  t mxCellPerPage;
27970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
27980 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
27990 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a  cells per page *
279a0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72   /* All cells fr
279d0 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  om pages being b
279e0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
279f0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
27a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
27a10 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
27a20 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ells */..  asser
27a30 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  t( pPage->pParen
27a40 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t==0 );.  assert
27a50 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
27a60 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  0 );.  pBt = pPa
27a70 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c  ge->pBt;.  mxCel
27a80 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45  lPerPage = MX_CE
27a90 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c  LL(pBt);.  apCel
27aa0 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
27ab0 52 61 77 28 20 6d 78 43 65 6c 6c 50 65 72 50 61  Raw( mxCellPerPa
27ac0 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b  ge*(sizeof(u8*)+
27ad0 73 69 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b 0a  sizeof(int)) );.
27ae0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
27af0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27b00 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20  NOMEM;.  szCell 
27b10 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b  = (int*)&apCell[
27b20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a  mxCellPerPage];.
27b30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
27b40 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  f ){.    /* The 
27b50 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
27b60 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20  ely empty */.   
27b70 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
27b80 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64  : empty table %d
27b90 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
27ba0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
27bb0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
27bc0 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68  e is empty but h
27bd0 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54  as one child.  T
27be0 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20  ransfer the.    
27bf0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
27c00 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69  rom that one chi
27c10 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74  ld into the root
27c20 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20   page if it .   
27c30 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54   ** will fit.  T
27c40 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20  his reduces the 
27c50 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65  depth of the tre
27c60 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  e by one..    **
27c70 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72  .    ** If the r
27c80 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65  oot page is page
27c90 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20   1, it has less 
27ca0 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
27cb0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20  than.    ** its 
27cc0 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68  child (due to th
27cd0 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65  e 100 byte heade
27ce0 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  r that occurs at
27cf0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
27d00 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74     ** of the dat
27d10 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69  abase fle), so i
27d20 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  t might not be a
27d30 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ble to hold all 
27d40 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69  of the .    ** i
27d50 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65  nformation curre
27d60 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69  ntly contained i
27d70 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66  n the child.  If
27d80 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20   this is the .  
27d90 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20    ** case, then 
27da0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72  do not do the tr
27db0 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70  ansfer.  Leave p
27dc0 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65  age 1 empty exce
27dd0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  pt.    ** for th
27de0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
27df0 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  to the child pag
27e00 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61  e.  The child pa
27e10 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a  ge becomes.    *
27e20 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  * the virtual ro
27e30 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  ot of the tree..
27e40 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43      */.    pgnoC
27e50 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
27e60 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
27e70 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
27e80 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
27e90 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20  pgnoChild>0 );. 
27ea0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
27eb0 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33 50 61 67  hild<=sqlite3Pag
27ec0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
27ed0 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20  e->pBt->pPager) 
27ee0 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50  );.    rc = getP
27ef0 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
27f00 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
27f10 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
27f20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
27f30 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
27f40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
27f50 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
27f60 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68  c = initPage(pCh
27f70 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20  ild, pPage);.   
27f80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
27f90 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
27fa0 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65  ance;.      asse
27fb0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  rt( pChild->nOve
27fc0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20  rflow==0 );.    
27fd0 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46    if( pChild->nF
27fe0 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20  ree>=100 ){.    
27ff0 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
28000 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c   information wil
28010 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
28020 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68  t page, so do th
28030 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
28040 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
28050 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f   i;.        zero
28060 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
28070 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ld->aData[0]);. 
28080 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
28090 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
280a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
280b0 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e   apCell[i] = fin
280c0 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b  dCell(pChild,i);
280d0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
280e0 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  l[i] = cellSizeP
280f0 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c  tr(pChild, apCel
28100 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
28110 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c  .        assembl
28120 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  ePage(pPage, pCh
28130 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65  ild->nCell, apCe
28140 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  ll, szCell);.   
28150 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
28160 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
28170 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74  f the child to t
28180 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
28190 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
281a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
281b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
281c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  , .            g
281d0 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d  et4byte(&pChild-
281e0 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68  >aData[pChild->h
281f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
28200 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28         freePage(
28210 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
28220 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
28230 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73  : child %d trans
28240 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22  fer to page 1\n"
28250 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
28260 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
28280 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66  ild has more inf
28290 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
282a0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
282b0 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ot..        ** T
282c0 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
282d0 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
282e0 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
282f0 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
28300 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77  ANCE: child %d w
28310 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70  ill not fit on p
28320 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
28330 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
28340 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
28350 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
28360 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e  >aData, pChild->
28370 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42  aData, pPage->pB
28380 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
28390 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
283a0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nit = 0;.      p
283b0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
283c0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  0;.      rc = in
283d0 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
283e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
283f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28400 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28  .      freePage(
28410 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54  pChild);.      T
28420 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
28430 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25  transfer child %
28440 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e  d into root %d\n
28450 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28460 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70   pChild->pgno, p
28470 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
28480 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70    }.    rc = rep
28490 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
284a0 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65  pPage);.    asse
284b0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
284c0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  flow==0 );.#ifnd
284d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
284e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
284f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28500 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  m ){.      int i
28510 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28520 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
28530 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20   i++){ .        
28540 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
28550 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  fl(pPage, i);.  
28560 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28580 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68       goto end_sh
28590 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
285a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
285b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
285c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
285d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
285e0 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
285f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28600 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64  pChild);.  }.end
28610 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
28620 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61  :.  sqliteFree(a
28630 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
28640 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
28650 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
28660 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57  overfull.**.** W
28670 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73  hen this happens
28680 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  , Create a new c
28690 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f  hild page and co
286a0 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  py the.** conten
286b0 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69  ts of the root i
286c0 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20  nto the child.  
286d0 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f  Then make the ro
286e0 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d  ot.** page an em
286f0 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69  pty page with ri
28700 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e  ghtChild pointin
28710 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  g to the new.** 
28720 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79  child.   Finally
28730 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69  , call balance_i
28740 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65  nternal() on the
28750 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f   new child.** to
28760 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c   cause it to spl
28770 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
28780 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
28790 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
287a0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
287b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
287c0 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
287d0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
287e0 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
287f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
28800 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
28810 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
28820 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50  oChild;     /* P
28830 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
28840 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
28850 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
28860 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt;         /* 
28870 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69  The BTree */.  i
28880 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
28890 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62     /* Total usab
288a0 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  le size of a pag
288b0 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  e */.  u8 *data;
288c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
288d0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72  ntent of the par
288e0 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ent page */.  u8
288f0 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20   *cdata;        
28900 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
28910 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a  the child page *
28920 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
28930 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
28940 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72  t to page header
28950 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20   in parent */.  
28960 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
28970 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
28980 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73   content of firs
28990 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74  t cell in parent
289a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
289b0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
289c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
289d0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
289e0 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
289f0 65 2d 3e 70 42 74 3b 0a 20 20 72 63 20 3d 20 61  e->pBt;.  rc = a
28a00 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
28a10 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26  (pBt, &pChild, &
28a20 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65  pgnoChild, pPage
28a30 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66  ->pgno, 0);.  if
28a40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28a50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
28a60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28a70 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
28a80 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  age) );.  usable
28a90 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
28aa0 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d  leSize;.  data =
28ab0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
28ac0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
28ad0 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d  rOffset;.  brk =
28ae0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
28af0 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61  hdr+5]);.  cdata
28b00 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61   = pChild->aData
28b10 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61  ;.  memcpy(cdata
28b20 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50  , &data[hdr], pP
28b30 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
28b40 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68  2*pPage->nCell-h
28b50 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63  dr);.  memcpy(&c
28b60 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61  data[brk], &data
28b70 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  [brk], usableSiz
28b80 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74  e-brk);.  assert
28b90 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74  ( pChild->isInit
28ba0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e  ==0 );.  rc = in
28bb0 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
28bc0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
28bd0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
28be0 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  eper_out;.  memc
28bf0 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
28c00 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
28c10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28c20 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
28c30 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
28c40 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
28c50 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
28c60 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  w;.  if( pChild-
28c70 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
28c80 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
28c90 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
28ca0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
28cb0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
28cc0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61  ;.  zeroPage(pPa
28cd0 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
28ce0 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
28cf0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
28d00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
28d10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
28d20 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54   pgnoChild);.  T
28d30 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
28d40 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
28d50 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
28d60 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
28d70 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  no));.#ifndef SQ
28d80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28d90 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
28da0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
28db0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20    int i;.    rc 
28dc0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
28dd0 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50   pChild->pgno, P
28de0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
28df0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ge->pgno);.    i
28e00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
28e10 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
28e20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
28e30 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
28e40 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
28e50 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68  trmapPutOvfl(pCh
28e60 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  ild, i);.      i
28e70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28e80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
28e90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28ea0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
28eb0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
28ec0 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a  onroot(pChild);.
28ed0 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f  .balancedeeper_o
28ee0 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
28ef0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74  e(pChild);.  ret
28f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28f10 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70   Decide if the p
28f20 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20  age pPage needs 
28f30 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20  to be balanced. 
28f40 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73   If balancing is
28f50 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61  .** required, ca
28f60 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ll the appropria
28f70 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  te balancing rou
28f80 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
28f90 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
28fa0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
28fb0 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  insert){.  int r
28fc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28fd0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
28fe0 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ent==0 ){.    if
28ff0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
29000 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
29010 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
29020 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
29030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29040 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
29050 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
29060 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
29070 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b  hallower(pPage);
29080 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29090 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
290a0 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
290b0 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20         (!insert 
290c0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
290d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
290e0 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
290f0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
29100 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29  e_nonroot(pPage)
29110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29120 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29130 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
29140 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72  hecks all cursor
29150 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
29160 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  table pgnoRoot..
29170 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f  ** If any of tho
29180 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20  se cursors were 
29190 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
291a0 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65  ag==0 in a diffe
291b0 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
291c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64   connection (a d
291d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
291e0 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74  on that shares t
291f0 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68  he pager.** cach
29200 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  e with the curre
29210 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61  nt connection) a
29220 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f  nd that other co
29230 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nnection .** is 
29240 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55  not in the ReadU
29250 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74  ncommmitted stat
29260 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
29270 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tine returns .**
29280 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
29290 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f  **.** In additio
292a0 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f  n to checking fo
292b0 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68  r read-locks (wh
292c0 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ere a read-lock 
292d0 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73  .** means a curs
292e0 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  or opened with w
292f0 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72  rFlag==0) this r
29300 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65  outine also move
29310 73 0a 2a 2a 20 61 6c 6c 20 63 75 72 73 6f 72 73  s.** all cursors
29320 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 73   write cursors s
29330 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
29340 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
29350 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c 20 6f  .** first Cell o
29360 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  n the root page.
29370 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
29380 61 72 79 20 62 65 63 61 75 73 65 20 61 6e 20 69  ary because an i
29390 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64 65 6c  nsert .** or del
293a0 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ete might change
293b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
293c0 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65 20 6f  ells on a page o
293d0 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20 70 61  r delete.** a pa
293e0 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e 64 20  ge entirely and 
293f0 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
29400 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75 72 73  o leave any curs
29410 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ors .** pointing
29420 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61 6e 74   to non-existant
29430 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c 73 2e   pages or cells.
29440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
29450 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74  heckReadLocks(Bt
29460 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
29470 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74 43 75  o pgnoRoot, BtCu
29480 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 29 7b  rsor *pExclude){
29490 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
294a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
294b0 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
294c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
294d0 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
294e0 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
294f0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
29500 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
29510 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
29520 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
29530 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29540 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65  VALID ) continue
29550 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  ;.    if( p->pgn
29560 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20  oRoot!=pgnoRoot 
29570 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
29580 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
29590 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
295a0 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e  3 *dbOther = p->
295b0 70 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b  pBtree->pSqlite;
295c0 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
295d0 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  er==0 ||.       
295e0 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26    (dbOther!=db &
295f0 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
29600 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
29610 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20  ncommitted)==0) 
29620 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
29630 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
29640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29650 73 65 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d  se if( p->pPage-
29660 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f  >pgno!=p->pgnoRo
29670 6f 74 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65  ot ){.      move
29680 54 6f 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d  ToRoot(p);.    }
29690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
296a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
296b0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
296c0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
296d0 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
296e0 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
296f0 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
29700 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
29710 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
29720 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
29730 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
29740 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
29750 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
29760 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
29770 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
29780 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
29790 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
297a0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
297b0 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
297c0 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
297d0 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
297e0 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
297f0 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
29800 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
29810 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
29820 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
29830 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
29840 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29850 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
29860 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29880 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
29890 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
298a0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
298b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
298c0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
298d0 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
298e0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
298f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
29900 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20 20  ta, int nData   
29910 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
29920 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
29930 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
29940 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73  int loc;.  int s
29950 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20  zNew;.  MemPage 
29960 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  *pPage;.  BtShar
29970 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
29980 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 75  pBtree->pBt;.  u
29990 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
299a0 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
299b0 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
299c0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  = 0;..  if( pBt-
299d0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
299e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
299f0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
29a00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
29a10 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
29a20 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65 74  nsert */.    ret
29a30 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
29a40 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
29a50 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
29a60 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
29a70 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
29a80 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d   );.  if( !pCur-
29a90 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
29aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
29ab0 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  M;   /* Cursor n
29ac0 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  ot open for writ
29ad0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
29ae0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
29af0 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
29b00 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
29b10 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ur) ){.    retur
29b20 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
29b30 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
29b40 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
29b50 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
29b60 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
29b70 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
29b80 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
29b90 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
29ba0 61 62 6c 65 20 2a 2f 0a 20 20 72 65 73 74 6f 72  able */.  restor
29bb0 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
29bc0 73 69 74 69 6f 6e 28 70 43 75 72 2c 20 30 29 3b  sition(pCur, 0);
29bd0 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49  .  if( .    SQLI
29be0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
29bf0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
29c00 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
29c10 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53   pCur)) ||.    S
29c20 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
29c30 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
29c40 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e  to(pCur, pKey, n
29c50 4b 65 79 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  Key, &loc)).  ){
29c60 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c70 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
29c80 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
29c90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
29ca0 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
29cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29cc0 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
29cd0 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20  e->leafData );. 
29ce0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
29cf0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
29d00 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
29d10 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
29d20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
29d30 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
29d40 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
29d50 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
29d60 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
29d70 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
29d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29d90 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20  >isInit );.  rc 
29da0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29db0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
29dc0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
29dd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77  return rc;.  new
29de0 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Cell = sqliteMal
29df0 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f  locRaw( MX_CELL_
29e00 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
29e10 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20  f( newCell==0 ) 
29e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29e30 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  MEM;.  rc = fill
29e40 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65  InCell(pPage, ne
29e50 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65  wCell, pKey, nKe
29e60 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  y, pData, nData,
29e70 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
29e80 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
29e90 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
29ea0 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
29eb0 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
29ec0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
29ed0 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
29ee0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
29ef0 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53  ( loc==0 && CURS
29f00 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
29f10 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 69 6e  eState ){.    in
29f20 74 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  t szOld;.    ass
29f30 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
29f40 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
29f50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
29f60 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
29f70 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
29f80 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
29f90 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
29fa0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
29fb0 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
29fc0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
29fd0 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
29fe0 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
29ff0 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2a000 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2a010 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2a020 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2a030 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2a040 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2a050 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
2a060 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
2a070 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2a080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a090 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2a0a0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
2a0b0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2a0c0 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
2a0d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2a0e0 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
2a0f0 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
2a100 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2a110 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a  idx, newCell, sz
2a120 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
2a130 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a140 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2a150 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  t;.  rc = balanc
2a160 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f  e(pPage, 1);.  /
2a170 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
2a180 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42 74  geDump(pCur->pBt
2a190 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2a1a0 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66  , 1); */.  /* ff
2a1b0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f  lush(stdout); */
2a1c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a1d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2a1e0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2a1f0 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  }.end_insert:.  
2a200 73 71 6c 69 74 65 46 72 65 65 28 6e 65 77 43 65  sqliteFree(newCe
2a210 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
2a220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2a230 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
2a240 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
2a250 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
2a260 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2a270 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a280 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2a290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a2a0 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
2a2b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2a2c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2a2d0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75  pCur->pPage;.  u
2a2e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2a2f0 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ell;.  int rc;. 
2a300 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
2a310 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
2a320 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2a330 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  ree->pBt;..  ass
2a340 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2a350 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  it );.  if( pBt-
2a360 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2a370 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2a380 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2a390 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2a3a0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65  efore doing a de
2a3b0 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
2a3c0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2a3d0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2a3e0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2a3f0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2a400 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2a410 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
2a420 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65  dx >= pPage->nCe
2a430 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
2a440 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
2a450 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  /* The cursor is
2a460 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
2a470 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
2a480 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2a490 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2a4a0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2a4b0 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65    /* Did not ope
2a4c0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f  n this cursor fo
2a4d0 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d  r writing */.  }
2a4e0 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
2a4f0 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72  Locks(pCur->pBtr
2a500 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ee, pCur->pgnoRo
2a510 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20  ot, pCur) ){.   
2a520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2a530 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
2a540 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
2a550 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
2a560 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ck */.  }..  /* 
2a570 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  Restore the curr
2a580 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2a590 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20  ion (a no-op if 
2a5a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2a5b0 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f  t in .  ** CURSO
2a5c0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
2a5d0 61 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68  ate) and save th
2a5e0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2a5f0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2a600 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74   .  ** open on t
2a610 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54  he same table. T
2a620 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
2a630 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
2a640 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68  the page.  ** th
2a650 61 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c  at the entry wil
2a660 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f  l be deleted fro
2a670 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  m..  */.  if( . 
2a680 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65     (rc = restore
2a690 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2a6a0 69 74 69 6f 6e 28 70 43 75 72 2c 20 31 29 29 21  ition(pCur, 1))!
2a6b0 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
2a6c0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2a6d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2a6e0 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c  ot, pCur))!=0 ||
2a6f0 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74  .    (rc = sqlit
2a700 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2a710 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2a720 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a730 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   rc;.  }..  /* L
2a740 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77  ocate the cell w
2a750 69 74 68 69 6e 20 69 74 27 73 20 70 61 67 65 20  ithin it's page 
2a760 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20  and leave pCell 
2a770 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a  pointing to the.
2a780 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63    ** data. The c
2a790 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20  learCell() call 
2a7a0 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c  frees any overfl
2a7b0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2a7c0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
2a7d0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c  * cell. The cell
2a7e0 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c   itself is still
2a7f0 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20   intact..  */.  
2a800 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2a810 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2a820 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
2a830 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2a840 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2a850 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
2a860 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2a870 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2a880 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2a890 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
2a8a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2a8b0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e  /*.    ** The en
2a8c0 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74  try we are about
2a8d0 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
2a8e0 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77  t a leaf so if w
2a8f0 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  e do not.    ** 
2a900 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20  do something we 
2a910 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c  will leave a hol
2a920 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  e on an internal
2a930 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65   page..    ** We
2a940 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68   have to fill th
2a950 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67  e hole by moving
2a960 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20   in a cell from 
2a970 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20  a leaf.  The.   
2a980 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66   ** next Cell af
2a990 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62  ter the one to b
2a9a0 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61  e deleted is gua
2a9b0 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
2a9c0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62   and.    ** to b
2a9d0 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63  e a leaf so we c
2a9e0 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a  an use it..    *
2a9f0 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c  /.    BtCursor l
2aa00 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69  eafCur;.    unsi
2aa10 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74  gned char *pNext
2aa20 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e 65 78 74  ;.    int szNext
2aa30 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 69 6c  ;  /* The compil
2aa40 65 72 20 77 61 72 6e 69 6e 67 20 69 73 20 77 72  er warning is wr
2aa50 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69 73 20 61  ong: szNext is a
2aa60 6c 77 61 79 73 20 0a 20 20 20 20 20 20 20 20 20  lways .         
2aa70 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69          ** initi
2aa80 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73  alized before us
2aa90 65 2e 20 20 41 64 64 69 6e 67 20 61 6e 20 65 78  e.  Adding an ex
2aaa0 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
2aab0 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
2aac0 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c 65 6e 63      ** to silenc
2aad0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 73  e the compiler s
2aae0 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65 20 63 6f  lows down the co
2aaf0 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  de. */.    int n
2ab00 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69  otUsed;.    unsi
2ab10 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43  gned char *tempC
2ab20 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ell = 0;.    ass
2ab30 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61  ert( !pPage->lea
2ab40 66 44 61 74 61 20 29 3b 0a 20 20 20 20 67 65 74  fData );.    get
2ab50 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2ab60 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2ab70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ab80 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2ab90 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2aba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2abb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
2abc0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
2abd0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2abe0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2abf0 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
2ac00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ac10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ac20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ac30 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72  gerWrite(leafCur
2ac40 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  .pPage->pDbPage)
2ac50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ac60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ac70 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2ac80 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2ac90 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2aca0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2acb0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2acc0 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2acd0 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2ace0 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2acf0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2ad00 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2ad10 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2ad20 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2ad30 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2ad40 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2ad50 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2ad60 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2ad70 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2ad80 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2ad90 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2ada0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2adb0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2adc0 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2add0 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73      tempCell = s
2ade0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2adf0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2ae00 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ) );.      if( t
2ae10 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2ae20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ae30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2ae40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ae50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ae60 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2ae70 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2ae80 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  r->idx, pNext-4,
2ae90 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2aea0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ell, 0);.    }. 
2aeb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2aec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
2aed0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2aee0 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  lowCell(pPage, p
2aef0 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43  Cur->idx), pgnoC
2af00 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20  hild);.      rc 
2af10 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2af20 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
2af30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2af40 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65   ){.      dropCe
2af50 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2af60 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2af70 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63  zNext);.      rc
2af80 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43   = balance(leafC
2af90 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ur.pPage, 0);.  
2afa0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
2afb0 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20  ee(tempCell);.  
2afc0 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72    releaseTempCur
2afd0 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
2afe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
2aff0 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2b000 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
2b010 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2b020 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2b030 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
2b040 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
2b050 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2b060 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2b070 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2b080 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2b090 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
2b0a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b0b0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2b0c0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2b0d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b0e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2b0f0 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2b100 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2b110 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2b120 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2b130 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2b140 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2b150 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2b160 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2b170 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2b180 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2b190 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2b1a0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2b1b0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2b1c0 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2b1d0 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2b1e0 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2b1f0 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2b200 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2b210 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2b220 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2b230 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2b240 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2b250 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2b260 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2b270 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74  L indices.*/.int
2b280 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
2b290 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2b2a0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2b2b0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2b2c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2b2d0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2b2e0 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2b2f0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2b300 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  rc;.  if( pBt->i
2b310 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2b320 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2b330 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2b340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2b350 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  st */.    return
2b360 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2b370 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2b380 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2b390 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2b3a0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2b3b0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
2b3c0 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20 61  egal to create a
2b3d0 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2b3e0 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2b3f0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2b400 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2b410 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2b420 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2b430 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2b440 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61 74  ed to move a dat
2b450 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d 61  abase page to ma
2b460 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2b470 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  new root-page.. 
2b480 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20 63   ** If an open c
2b490 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
2b4a0 74 68 65 20 70 61 67 65 20 61 20 70 72 6f 62 6c  the page a probl
2b4b0 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  em would occur..
2b4c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2b4d0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
2b4e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2b4f0 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  KED;.  }..#ifdef
2b500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2b510 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
2b520 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2b530 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2b540 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2b550 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b560 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66  n rc;.#else.  if
2b570 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2b580 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
2b590 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
2b5a0 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
2b5b0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2b5c0 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2b5d0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2b5e0 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
2b5f0 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
2b600 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  o. */..    /* Re
2b610 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
2b620 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
2b630 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
2b640 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
2b650 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
2b660 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2b670 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
2b680 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
2b690 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2b6a0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
2b6b0 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
2b6c0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
2b6d0 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
2b6e0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b6f0 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2b700 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
2b710 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b720 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2b730 72 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74  rc;.    pgnoRoot
2b740 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2b750 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2b760 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2b770 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2b780 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2b790 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2b7a0 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2b7b0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
2b7c0 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2b7d0 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2b7e0 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2b7f0 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2b800 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2b810 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2b820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2b830 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2b840 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2b850 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2b860 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2b870 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2b880 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2b890 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2b8a0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2b8b0 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2b8c0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2b8d0 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2b8e0 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2b8f0 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2b900 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2b910 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2b920 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2b930 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2b940 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b970 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2b980 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2b990 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2b9a0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
2b9b0 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
2b9c0 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
2b9d0 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 67  e);.      rc = g
2b9e0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
2b9f0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
2ba00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ba10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ba30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2ba40 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
2ba50 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
2ba60 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
2ba70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ba80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65  LITE_OK || eType
2ba90 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
2baa0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
2bab0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2bac0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2bad0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2bae0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2baf0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2bb00 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
2bb10 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
2bb20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2bb30 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
2bb40 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
2bb50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2bb60 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
2bb70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2bb80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bb90 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2bba0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2bbb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2bbd0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
2bbe0 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
2bbf0 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
2bc00 6f 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  ove);.      rele
2bc10 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2bc20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2bc30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bc40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bc50 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2bc60 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 70 67   getPage(pBt, pg
2bc70 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
2bc80 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2bc90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2bcb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bcc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bcd0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2bce0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2bcf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bd00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2bd10 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2bd20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2bd30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2bd40 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
2bd50 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
2bd60 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
2bd70 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2bd80 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
2bd90 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
2bda0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
2bdb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
2bdc0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2bdd0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
2bde0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
2bdf0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2be00 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2be10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2be20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
2be30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2be40 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2be50 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2be60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
2be70 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2be80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2be90 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
2bea0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
2beb0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2bec0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2bed0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2bee0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bef0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2bf00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bf10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2bf20 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
2bf30 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
2bf40 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
2bf50 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
2bf60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2bf70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2bf80 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
2bf90 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
2bfa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bfb0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74  }../*.** Erase t
2bfc0 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
2bfd0 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69  e page and all i
2bfe0 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65  ts children.  Re
2bff0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  turn.** the page
2c000 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2c010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c020 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2c030 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2c040 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
2c050 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20   The BTree that 
2c060 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62  contains the tab
2c070 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
2c080 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o,            /*
2c090 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
2c0a0 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  clear */.  MemPa
2c0b0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
2c0c0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e   /* Parent page.
2c0d0 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72    NULL for the r
2c0e0 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65  oot */.  int fre
2c0f0 65 50 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f  ePageFlag      /
2c100 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67  * Deallocate pag
2c110 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  e if true */.){.
2c120 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c130 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2c140 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2c150 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pCell;.  int i;
2c160 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c  ..  if( pgno>sql
2c170 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
2c180 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
2c190 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c1a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c1b0 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67  T;.  }..  rc = g
2c1c0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2c1d0 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c  t, pgno, &pPage,
2c1e0 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28   pParent);.  if(
2c1f0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2c200 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2c210 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2c220 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2c230 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ){.    pCell = f
2c240 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2c250 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2c260 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c270 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2c280 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2c290 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
2c2a0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2c2b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2c2c0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2c2d0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  asepage_out;.   
2c2e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61   }.    rc = clea
2c2f0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2c300 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
2c310 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2c320 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2c330 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
2c340 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  leaf ){.    rc =
2c350 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2c360 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
2c370 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38  (&pPage->aData[8
2c380 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ]), pPage->pPare
2c390 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  nt, 1);.    if( 
2c3a0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2c3b0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2c3c0 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
2c3d0 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
2c3e0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2c3f0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
2c400 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2c410 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2c420 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
2c430 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2c440 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
2c450 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
2c460 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
2c470 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
2c480 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2c490 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2c4a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2c4b0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2c4c0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
2c4d0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
2c4e0 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
2c4f0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
2c500 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
2c510 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
2c520 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
2c530 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
2c540 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2c550 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
2c560 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
2c570 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2c580 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2c590 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2c5a0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2c5b0 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
2c5c0 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
2c5d0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
2c5e0 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
2c5f0 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
2c600 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
2c610 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2c620 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2c630 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74  t iTable){.  int
2c640 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
2c650 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2c660 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2c670 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2c680 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2c690 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2c6a0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2c6b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2c6c0 20 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c   rc = checkReadL
2c6d0 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  ocks(p, iTable, 
2c6e0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
2c6f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c700 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2c710 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 6c  e position of al
2c720 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  l cursors open o
2c730 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  n this table */.
2c740 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2c750 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
2c760 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c  rsors(pBt, iTabl
2c770 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 72 65  e, 0)) ){.    re
2c780 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2c790 72 65 74 75 72 6e 20 63 6c 65 61 72 44 61 74 61  return clearData
2c7a0 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50  basePage(pBt, (P
2c7b0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30  gno)iTable, 0, 0
2c7c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  );.}../*.** Eras
2c7d0 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
2c7e0 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  n in a table and
2c7f0 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   add the root of
2c800 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a   the table to.**
2c810 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2c820 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74  Except, the root
2c830 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c   of the principl
2c840 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65  e table (the one
2c850 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69   on.** page 1) i
2c860 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
2c870 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2c880 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2c890 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2c8a0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2c8b0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2c8c0 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20  open.** cursors 
2c8d0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  on the table..**
2c8e0 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
2c8f0 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64  M is enabled and
2c900 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61   the page at iTa
2c910 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  ble is not the l
2c920 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  ast.** root page
2c930 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c940 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
2c950 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a  last root page .
2c960 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2c970 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64  se file is moved
2c980 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66   into the slot f
2c990 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2c9a0 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e   by.** iTable an
2c9b0 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74  d that last slot
2c9c0 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
2c9d0 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72  ed by the last r
2c9e0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  oot page.** is a
2c9f0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2ca00 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20  list instead of 
2ca10 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73  iTable.  In this
2ca20 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f   say, all.** roo
2ca30 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74  t pages are kept
2ca40 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2ca50 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2ca60 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a  e file, which.**
2ca70 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
2ca80 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20  r AUTOVACUUM to 
2ca90 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69  work right.  *pi
2caa0 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2cab0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d  the .** page num
2cac0 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f  ber that used to
2cad0 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   be the last roo
2cae0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
2caf0 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  le before.** the
2cb00 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61   move.  If no pa
2cb10 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a  ge gets moved, *
2cb20 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
2cb30 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  o 0..** The last
2cb40 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65   root page is re
2cb50 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33  corded in meta[3
2cb60 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ] and the value 
2cb70 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73  of.** meta[3] is
2cb80 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73   updated by this
2cb90 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 69   procedure..*/.i
2cba0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
2cbb0 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
2cbc0 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
2cbd0 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
2cbe0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2cbf0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2cc00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2cc10 70 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70  p->pBt;..  if( p
2cc20 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2cc30 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2cc40 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2cc50 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2cc60 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2cc70 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ROR;.  }..  /* I
2cc80 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
2cc90 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
2cca0 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
2ccb0 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
2ccc0 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
2ccd0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
2cce0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
2ccf0 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
2cd00 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
2cd10 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
2cd20 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
2cd30 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
2cd40 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
2cd50 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
2cd60 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
2cd70 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
2cd80 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
2cd90 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
2cda0 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
2cdb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2cdc0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
2cdd0 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  ..  rc = getPage
2cde0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2cdf0 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  le, &pPage, 0);.
2ce00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ce10 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
2ce20 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
2ce30 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a  ble(p, iTable);.
2ce40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ce50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2ce60 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
2ce70 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76  c;.  }..  *piMov
2ce80 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ed = 0;..  if( i
2ce90 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65  Table>1 ){.#ifde
2cea0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2ceb0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20  TOVACUUM.    rc 
2cec0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2ced0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2cee0 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65  ge(pPage);.#else
2cef0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2cf00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2cf10 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67    Pgno maxRootPg
2cf20 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
2cf30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2cf40 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f  ta(p, 4, &maxRoo
2cf50 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  tPgno);.      if
2cf60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cf70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2cf80 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2cf90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2cfa0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2cfb0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78   if( iTable==max
2cfc0 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20  RootPgno ){.    
2cfd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61      /* If the ta
2cfe0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
2cff0 64 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77  d is the table w
2d000 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2d010 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
2d020 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
2d030 68 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74  he database, put
2d040 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2d050 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  n the free list.
2d060 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
2d070 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2d080 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2d090 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2d0a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2d0b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2d0d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d0e0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2d0f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d100 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
2d110 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ed does not have
2d120 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2d130 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2d140 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2d150 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76  database. So mov
2d160 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  e the page that 
2d170 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20  does into the . 
2d180 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65         ** gap le
2d190 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
2d1a0 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20  d root-page..   
2d1b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d1c0 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a  MemPage *pMove;.
2d1d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d1e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2d1f0 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2d200 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
2d210 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
2d220 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d240 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d250 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d260 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
2d270 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c  Page(pBt, pMove,
2d280 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
2d290 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  , 0, iTable);.  
2d2a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2d2b0 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2d2c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d2d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d2e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2d300 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2d310 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
2d320 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
2d330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2d350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2d370 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
2d380 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2d390 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
2d3a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2d3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d3e0 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
2d3f0 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2d400 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
2d410 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
2d420 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
2d430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
2d440 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
2d450 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
2d460 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
2d470 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
2d480 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
2d490 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
2d4a0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
2d4b0 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
2d4c0 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
2d4d0 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
2d4e0 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
2d4f0 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
2d500 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
2d510 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2d520 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d530 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
2d540 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2d550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2d560 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2d570 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2d580 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
2d590 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
2d5a0 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2d5b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2d5c0 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
2d5d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2d5e0 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
2d5f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2d600 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2d610 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2d620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2d630 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2d640 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
2d650 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2d660 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
2d670 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
2d680 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
2d690 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
2d6a0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
2d6b0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2d6c0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
2d6d0 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
2d6e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2d6f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2d700 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  ;  .}.../*.** Re
2d710 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f  ad the meta-info
2d720 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61  rmation out of a
2d730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d740 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74   Meta[0].** is t
2d750 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
2d760 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  e pages currentl
2d770 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2d780 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74  e.  Meta[1].** t
2d790 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20  hrough meta[15] 
2d7a0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  are available fo
2d7b0 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20  r use by higher 
2d7c0 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d  layers.  Meta[0]
2d7d0 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  .** is read-only
2d7e0 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65  , the others are
2d7f0 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20   read/write..** 
2d800 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c  .** The schema l
2d810 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74  ayer numbers met
2d820 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65  a values differe
2d830 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63  ntly.  At the sc
2d840 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61  hema.** layer (a
2d850 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65  nd the SetCookie
2d860 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20   and ReadCookie 
2d870 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d  opcodes) the num
2d880 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70  ber of.** free p
2d890 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69  ages is not visi
2d8a0 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b  ble.  So Cookie[
2d8b0 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  0] is the same a
2d8c0 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e  s Meta[1]..*/.in
2d8d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
2d8e0 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  tMeta(Btree *p, 
2d8f0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d  int idx, u32 *pM
2d900 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  eta){.  DbPage *
2d910 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  pDbPage;.  int r
2d920 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
2d930 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61  ar *pP1;.  BtSha
2d940 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2d950 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  t;..  /* Reading
2d960 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
2d970 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
2d980 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
2d990 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
2d9a0 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
2d9b0 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
2d9c0 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
2d9d0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2d9e0 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
2d9f0 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
2da00 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
2da10 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
2da20 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
2da30 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
2da40 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
2da50 61 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c  ase by queryTabl
2da60 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b  eLock() and lock
2da70 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20  Table())..  */. 
2da80 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
2da90 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f  Lock(p, 1, READ_
2daa0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
2dab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2dad0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2dae0 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =0 && idx<=15 );
2daf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2db00 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
2db10 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65  ger, 1, &pDbPage
2db20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2db30 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 31 20 3d  turn rc;.  pP1 =
2db40 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
2db50 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
2db60 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
2db70 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62    *pMeta = get4b
2db80 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
2db90 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33  x*4]);.  sqlite3
2dba0 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
2dbb0 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75  ge);..  /* If au
2dbc0 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69  tovacuumed is di
2dbd0 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  sabled in this b
2dbe0 75 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20  uild but we are 
2dbf0 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20  trying to .  ** 
2dc00 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61  access an autova
2dc10 63 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c  cuumed database,
2dc20 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64   then make the d
2dc30 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79  atabase readonly
2dc40 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  . .  */.#ifdef S
2dc50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2dc60 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d  ACUUM.  if( idx=
2dc70 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29  =4 && *pMeta>0 )
2dc80 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
2dc90 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   1;.#endif..  /*
2dca0 20 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c   Grab the read-l
2dcb0 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  ock on page 1. *
2dcc0 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62  /.  rc = lockTab
2dcd0 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  le(p, 1, READ_LO
2dce0 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  CK);.  return rc
2dcf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
2dd00 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2dd10 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
2dd20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
2dd30 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
2dd40 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
2dd50 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
2dd60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
2dd70 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
2dd80 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
2dd90 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
2dda0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2ddb0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2ddc0 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
2ddd0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
2dde0 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
2ddf0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2de00 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2de10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
2de20 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2de30 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2de40 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2de50 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
2de60 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70  pPage1!=0 );.  p
2de70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
2de80 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
2de90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dea0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
2deb0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2dec0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ded0 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33   put4byte(&pP1[3
2dee0 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74  6 + idx*4], iMet
2def0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  a);.  return SQL
2df00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2df10 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67   Return the flag
2df20 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67   byte at the beg
2df30 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61  inning of the pa
2df40 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ge that the curs
2df50 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
2df60 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  ly pointing to..
2df70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2df80 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f  reeFlags(BtCurso
2df90 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
2dfa0 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20  ODO: What about 
2dfb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2dfc0 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62  EK state? Probab
2dfd0 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a  ly need to call.
2dfe0 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c    ** restoreOrCl
2dff0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2e000 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  n() here..  */. 
2e010 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2e020 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2e030 20 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20   return pPage ? 
2e040 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e050 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a  ge->hdrOffset] :
2e060 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
2e070 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2e080 20 50 72 69 6e 74 20 61 20 64 69 73 61 73 73 65   Print a disasse
2e090 6d 62 6c 79 20 6f 66 20 74 68 65 20 67 69 76 65  mbly of the give
2e0a0 6e 20 70 61 67 65 20 6f 6e 20 73 74 61 6e 64 61  n page on standa
2e0b0 72 64 20 6f 75 74 70 75 74 2e 20 20 54 68 69 73  rd output.  This
2e0c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 75   routine.** is u
2e0d0 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
2e0e0 67 20 61 6e 64 20 74 65 73 74 69 6e 67 20 6f 6e  g and testing on
2e0f0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
2e100 74 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28  t btreePageDump(
2e110 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
2e120 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63  nt pgno, int rec
2e130 75 72 73 69 76 65 2c 20 4d 65 6d 50 61 67 65 20  ursive, MemPage 
2e140 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
2e150 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2e160 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pPage;.  int i, 
2e170 6a 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 46 72 65  j, c;.  int nFre
2e180 65 3b 0a 20 20 75 31 36 20 69 64 78 3b 0a 20 20  e;.  u16 idx;.  
2e190 69 6e 74 20 68 64 72 3b 0a 20 20 69 6e 74 20 6e  int hdr;.  int n
2e1a0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 49 6e  Cell;.  int isIn
2e1b0 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  it;.  unsigned c
2e1c0 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 63 68 61  har *data;.  cha
2e1d0 72 20 72 61 6e 67 65 5b 32 30 5d 3b 0a 20 20 75  r range[20];.  u
2e1e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 61 79  nsigned char pay
2e1f0 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20 20 72 63 20  load[20];..  rc 
2e200 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28  = getPage(pBt, (
2e210 50 67 6e 6f 29 70 67 6e 6f 2c 20 26 70 50 61 67  Pgno)pgno, &pPag
2e220 65 2c 20 30 29 3b 0a 20 20 69 73 49 6e 69 74 20  e, 0);.  isInit 
2e230 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
2e240 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
2e250 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Init==0 ){.    i
2e260 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
2e270 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  Parent);.  }.  i
2e280 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2e290 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 68 64  urn rc;.  }.  hd
2e2a0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2e2b0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
2e2c0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63  Page->aData;.  c
2e2d0 20 3d 20 64 61 74 61 5b 68 64 72 5d 3b 0a 20 20   = data[hdr];.  
2e2e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
2e2f0 28 63 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59  (c & (PTF_INTKEY
2e300 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21  |PTF_LEAFDATA))!
2e310 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72  =0;.  pPage->zer
2e320 6f 44 61 74 61 20 3d 20 28 63 20 26 20 50 54 46  oData = (c & PTF
2e330 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
2e340 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
2e350 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46   = (c & PTF_LEAF
2e360 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
2e370 65 2d 3e 6c 65 61 66 20 3d 20 28 63 20 26 20 50  e->leaf = (c & P
2e380 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70  TF_LEAF)!=0;.  p
2e390 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
2e3a0 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
2e3b0 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
2e3c0 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
2e3d0 66 44 61 74 61 29 29 3b 0a 20 20 6e 43 65 6c 6c  fData));.  nCell
2e3e0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
2e3f0 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 73 71 6c  a[hdr+3]);.  sql
2e400 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2e410 22 50 41 47 45 20 25 64 3a 20 20 66 6c 61 67 73  "PAGE %d:  flags
2e420 3d 30 78 25 30 32 78 20 20 66 72 61 67 3d 25 64  =0x%02x  frag=%d
2e430 20 20 20 70 61 72 65 6e 74 3d 25 64 5c 6e 22 2c     parent=%d\n",
2e440 20 70 67 6e 6f 2c 0a 20 20 20 20 64 61 74 61 5b   pgno,.    data[
2e450 68 64 72 5d 2c 20 64 61 74 61 5b 68 64 72 2b 37  hdr], data[hdr+7
2e460 5d 2c 20 0a 20 20 20 20 28 70 50 61 67 65 2d 3e  ], .    (pPage->
2e470 69 73 49 6e 69 74 20 26 26 20 70 50 61 67 65 2d  isInit && pPage-
2e480 3e 70 50 61 72 65 6e 74 29 20 3f 20 70 50 61 67  >pParent) ? pPag
2e490 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
2e4a0 20 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28   : 0);.  assert(
2e4b0 20 68 64 72 20 3d 3d 20 28 70 67 6e 6f 3d 3d 31   hdr == (pgno==1
2e4c0 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
2e4d0 20 69 64 78 20 3d 20 68 64 72 20 2b 20 31 32 20   idx = hdr + 12 
2e4e0 2d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b  - pPage->leaf*4;
2e4f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
2e500 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43  ell; i++){.    C
2e510 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2e520 20 20 50 67 6e 6f 20 63 68 69 6c 64 3b 0a 20 20    Pgno child;.  
2e530 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e540 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
2e550 73 7a 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  sz;.    int addr
2e560 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 67 65  ;..    addr = ge
2e570 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t2byte(&data[idx
2e580 20 2b 20 32 2a 69 5d 29 3b 0a 20 20 20 20 70 43   + 2*i]);.    pC
2e590 65 6c 6c 20 3d 20 26 64 61 74 61 5b 61 64 64 72  ell = &data[addr
2e5a0 5d 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c  ];.    parseCell
2e5b0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2e5c0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
2e5d0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2e5e0 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65     sprintf(range
2e5f0 2c 22 25 64 2e 2e 25 64 22 2c 20 61 64 64 72 2c  ,"%d..%d", addr,
2e600 20 61 64 64 72 2b 73 7a 2d 31 29 3b 0a 20 20 20   addr+sz-1);.   
2e610 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2e620 20 29 7b 0a 20 20 20 20 20 20 63 68 69 6c 64 20   ){.      child 
2e630 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
2e640 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 67 65        child = ge
2e650 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2e660 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 69 6e     }.    sz = in
2e670 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66  fo.nData;.    if
2e680 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
2e690 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b   ) sz += info.nK
2e6a0 65 79 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 73  ey;.    if( sz>s
2e6b0 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d 31  izeof(payload)-1
2e6c0 20 29 20 73 7a 20 3d 20 73 69 7a 65 6f 66 28 70   ) sz = sizeof(p
2e6d0 61 79 6c 6f 61 64 29 2d 31 3b 0a 20 20 20 20 6d  ayload)-1;.    m
2e6e0 65 6d 63 70 79 28 70 61 79 6c 6f 61 64 2c 20 26  emcpy(payload, &
2e6f0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 48 65 61 64  pCell[info.nHead
2e700 65 72 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 66 6f  er], sz);.    fo
2e710 72 28 6a 3d 30 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b  r(j=0; j<sz; j++
2e720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 79  ){.      if( pay
2e730 6c 6f 61 64 5b 6a 5d 3c 30 78 32 30 20 7c 7c 20  load[j]<0x20 || 
2e740 70 61 79 6c 6f 61 64 5b 6a 5d 3e 30 78 37 66 20  payload[j]>0x7f 
2e750 29 20 70 61 79 6c 6f 61 64 5b 6a 5d 20 3d 20 27  ) payload[j] = '
2e760 2e 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  .';.    }.    pa
2e770 79 6c 6f 61 64 5b 73 7a 5d 20 3d 20 30 3b 0a 20  yload[sz] = 0;. 
2e780 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2e790 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 63 65  rintf(.      "ce
2e7a0 6c 6c 20 25 32 64 3a 20 69 3d 25 2d 31 30 73 20  ll %2d: i=%-10s 
2e7b0 63 68 6c 64 3d 25 2d 34 64 20 6e 6b 3d 25 2d 34  chld=%-4d nk=%-4
2e7c0 6c 6c 64 20 6e 64 3d 25 2d 34 64 20 70 61 79 6c  lld nd=%-4d payl
2e7d0 6f 61 64 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20  oad=%s\n",.     
2e7e0 20 69 2c 20 72 61 6e 67 65 2c 20 63 68 69 6c 64   i, range, child
2e7f0 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 69 6e 66  , info.nKey, inf
2e800 6f 2e 6e 44 61 74 61 2c 20 70 61 79 6c 6f 61 64  o.nData, payload
2e810 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66  .    );.  }.  if
2e820 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2e830 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
2e840 75 67 50 72 69 6e 74 66 28 22 72 69 67 68 74 5f  ugPrintf("right_
2e850 63 68 69 6c 64 3a 20 25 64 5c 6e 22 2c 20 67 65  child: %d\n", ge
2e860 74 34 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t4byte(&data[hdr
2e870 2b 38 5d 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 72  +8]));.  }.  nFr
2e880 65 65 20 3d 20 30 3b 0a 20 20 69 20 3d 20 30 3b  ee = 0;.  i = 0;
2e890 0a 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74  .  idx = get2byt
2e8a0 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
2e8b0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20  .  while( idx>0 
2e8c0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42  && idx<pPage->pB
2e8d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
2e8e0 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65  .    int sz = ge
2e8f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t2byte(&data[idx
2e900 2b 32 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  +2]);.    sprint
2e910 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64 22  f(range,"%d..%d"
2e920 2c 20 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31 29  , idx, idx+sz-1)
2e930 3b 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73  ;.    nFree += s
2e940 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  z;.    sqlite3De
2e950 62 75 67 50 72 69 6e 74 66 28 22 66 72 65 65 62  bugPrintf("freeb
2e960 6c 6f 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31 30  lock %2d: i=%-10
2e970 73 20 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74 61  s size=%-4d tota
2e980 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
2e990 69 2c 20 72 61 6e 67 65 2c 20 73 7a 2c 20 6e 46  i, range, sz, nF
2e9a0 72 65 65 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  ree);.    idx = 
2e9b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
2e9c0 64 78 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20  dx]);.    i++;. 
2e9d0 20 7d 0a 20 20 69 66 28 20 69 64 78 21 3d 30 20   }.  if( idx!=0 
2e9e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
2e9f0 62 75 67 50 72 69 6e 74 66 28 22 45 52 52 4f 52  bugPrintf("ERROR
2ea00 3a 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  : next freeblock
2ea10 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
2ea20 6e 67 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78 29  nge: %d\n", idx)
2ea30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 63 75  ;.  }.  if( recu
2ea40 72 73 69 76 65 20 26 26 20 21 70 50 61 67 65 2d  rsive && !pPage-
2ea50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 66 6f 72  >leaf ){.    for
2ea60 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
2ea70 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69 67  ++){.      unsig
2ea80 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 20  ned char *pCell 
2ea90 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2eaa0 2c 20 69 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , i);.      btre
2eab0 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67  ePageDump(pBt, g
2eac0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
2ead0 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20  1, pPage);.     
2eae0 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28   idx = get2byte(
2eaf0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  pCell);.    }.  
2eb00 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28    btreePageDump(
2eb10 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 64  pBt, get4byte(&d
2eb20 61 74 61 5b 68 64 72 2b 38 5d 29 2c 20 31 2c 20  ata[hdr+8]), 1, 
2eb30 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50  pPage);.  }.  pP
2eb40 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
2eb50 49 6e 69 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  Init;.  sqlite3P
2eb60 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
2eb70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 66 66 6c  >pDbPage);.  ffl
2eb80 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 72  ush(stdout);.  r
2eb90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2eba0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2ebb0 72 65 65 50 61 67 65 44 75 6d 70 28 42 74 72 65  reePageDump(Btre
2ebc0 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f 2c 20  e *p, int pgno, 
2ebd0 69 6e 74 20 72 65 63 75 72 73 69 76 65 29 7b 0a  int recursive){.
2ebe0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
2ebf0 67 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c 20 70  geDump(p->pBt, p
2ec00 67 6e 6f 2c 20 72 65 63 75 72 73 69 76 65 2c 20  gno, recursive, 
2ec10 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  0);.}.#endif..#i
2ec20 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2ec30 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
2ec40 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
2ec50 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73 75  /*.** Fill aResu
2ec60 6c 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72 6d  lt[] with inform
2ec70 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
2ec80 65 6e 74 72 79 20 61 6e 64 20 70 61 67 65 20 74  entry and page t
2ec90 68 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  hat the.** curso
2eca0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2ecb0 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73 75  ..** .**   aResu
2ecc0 6c 74 5b 30 5d 20 3d 20 20 54 68 65 20 70 61 67  lt[0] =  The pag
2ecd0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52  e number.**   aR
2ece0 65 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20  esult[1] =  The 
2ecf0 65 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20  entry number.** 
2ed00 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20    aResult[2] =  
2ed10 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ed20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20  entries on this 
2ed30 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c  page.**   aResul
2ed40 74 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a  t[3] =  Cell siz
2ed50 65 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  e (local payload
2ed60 20 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20 20 20   + header).**   
2ed70 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75  aResult[4] =  Nu
2ed80 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
2ed90 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a  es on this page.
2eda0 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 35 5d 20  **   aResult[5] 
2edb0 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65  =  Number of fre
2edc0 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  e blocks on the 
2edd0 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c  page.**   aResul
2ede0 74 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61  t[6] =  Total pa
2edf0 79 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f 63 61  yload size (loca
2ee00 6c 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a  l + overflow).**
2ee10 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
2ee20 20 48 65 61 64 65 72 20 73 69 7a 65 20 69 6e 20   Header size in 
2ee30 62 79 74 65 73 0a 2a 2a 20 20 20 61 52 65 73 75  bytes.**   aResu
2ee40 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70  lt[8] =  Local p
2ee50 61 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20  ayload size.**  
2ee60 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50   aResult[9] =  P
2ee70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
2ee80 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 31  r.**   aResult[1
2ee90 30 5d 3d 20 20 50 61 67 65 20 6e 75 6d 62 65 72  0]=  Page number
2eea0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
2eeb0 65 72 66 6c 6f 77 20 70 61 67 65 0a 2a 2a 0a 2a  erflow page.**.*
2eec0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2eed0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
2eee0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2eef0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   only..*/.int sq
2ef00 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
2ef10 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
2ef20 43 75 72 2c 20 69 6e 74 20 2a 61 52 65 73 75 6c  Cur, int *aResul
2ef30 74 2c 20 69 6e 74 20 75 70 43 6e 74 29 7b 0a 20  t, int upCnt){. 
2ef40 20 69 6e 74 20 63 6e 74 2c 20 69 64 78 3b 0a 20   int cnt, idx;. 
2ef50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2ef60 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2ef70 20 42 74 43 75 72 73 6f 72 20 74 6d 70 43 75 72   BtCursor tmpCur
2ef80 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ;..  int rc = re
2ef90 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2efa0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 2c  orPosition(pCur,
2efb0 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   1);.  if( rc!=S
2efc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2efd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2efe0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2eff0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 67 65 74  >isInit );.  get
2f000 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2f010 20 26 74 6d 70 43 75 72 29 3b 0a 20 20 77 68 69   &tmpCur);.  whi
2f020 6c 65 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20  le( upCnt-- ){. 
2f030 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2f040 26 74 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  &tmpCur);.  }.  
2f050 70 50 61 67 65 20 3d 20 74 6d 70 43 75 72 2e 70  pPage = tmpCur.p
2f060 50 61 67 65 3b 0a 20 20 61 52 65 73 75 6c 74 5b  Page;.  aResult[
2f070 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  0] = sqlite3Page
2f080 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
2f090 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 61  e->pDbPage);.  a
2f0a0 73 73 65 72 74 28 20 61 52 65 73 75 6c 74 5b 30  ssert( aResult[0
2f0b0 5d 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  ]==pPage->pgno )
2f0c0 3b 0a 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d  ;.  aResult[1] =
2f0d0 20 74 6d 70 43 75 72 2e 69 64 78 3b 0a 20 20 61   tmpCur.idx;.  a
2f0e0 52 65 73 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67  Result[2] = pPag
2f0f0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  e->nCell;.  if( 
2f100 74 6d 70 43 75 72 2e 69 64 78 3e 3d 30 20 26 26  tmpCur.idx>=0 &&
2f110 20 74 6d 70 43 75 72 2e 69 64 78 3c 70 50 61 67   tmpCur.idx<pPag
2f120 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2f130 67 65 74 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70  getCellInfo(&tmp
2f140 43 75 72 29 3b 0a 20 20 20 20 61 52 65 73 75 6c  Cur);.    aResul
2f150 74 5b 33 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e  t[3] = tmpCur.in
2f160 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52  fo.nSize;.    aR
2f170 65 73 75 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75  esult[6] = tmpCu
2f180 72 2e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  r.info.nData;.  
2f190 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74    aResult[7] = t
2f1a0 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64  mpCur.info.nHead
2f1b0 65 72 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  er;.    aResult[
2f1c0 38 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f  8] = tmpCur.info
2f1d0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  .nLocal;.  }else
2f1e0 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d  {.    aResult[3]
2f1f0 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c   = 0;.    aResul
2f200 74 5b 36 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52  t[6] = 0;.    aR
2f210 65 73 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20  esult[7] = 0;.  
2f220 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30    aResult[8] = 0
2f230 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b  ;.  }.  aResult[
2f240 34 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65  4] = pPage->nFre
2f250 65 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20  e;.  cnt = 0;.  
2f260 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
2f270 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2f280 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d  ge->hdrOffset+1]
2f290 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e  );.  while( idx>
2f2a0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
2f2b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2f2c0 29 7b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  ){.    cnt++;.  
2f2d0 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
2f2e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  (&pPage->aData[i
2f2f0 64 78 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73  dx]);.  }.  aRes
2f300 75 6c 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20  ult[5] = cnt;.  
2f310 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
2f320 6e 74 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50  nt==0 || isRootP
2f330 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
2f340 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30    aResult[9] = 0
2f350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2f360 52 65 73 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67  Result[9] = pPag
2f370 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  e->pParent->pgno
2f380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 6d 70 43  ;.  }.  if( tmpC
2f390 75 72 2e 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ur.info.iOverflo
2f3a0 77 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74  w ){.    aResult
2f3b0 5b 31 30 5d 20 3d 20 67 65 74 34 62 79 74 65 28  [10] = get4byte(
2f3c0 26 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 70 43 65  &tmpCur.info.pCe
2f3d0 6c 6c 5b 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69  ll[tmpCur.info.i
2f3e0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 7d 65  Overflow]);.  }e
2f3f0 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74  lse{.    aResult
2f400 5b 31 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  [10] = 0;.  }.  
2f410 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  releaseTempCurso
2f420 72 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65  r(&tmpCur);.  re
2f430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f440 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2f450 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72  Return the pager
2f460 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2f470 20 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20   a BTree.  This 
2f480 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2f490 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
2f4a0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
2f4b0 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c  y..*/.Pager *sql
2f4c0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42  ite3BtreePager(B
2f4d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
2f4e0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  rn p->pBt->pPage
2f4f0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
2f500 20 73 74 72 75 63 74 75 72 65 20 69 73 20 70 61   structure is pa
2f510 73 73 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f  ssed around thro
2f520 75 67 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69  ugh all the sani
2f530 74 79 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74  ty checking rout
2f540 69 6e 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  ines.** in order
2f550 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   to keep track o
2f560 66 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74  f some global st
2f570 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ate information.
2f580 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2f590 63 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49  ct IntegrityCk I
2f5a0 6e 74 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75  ntegrityCk;.stru
2f5b0 63 74 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b  ct IntegrityCk {
2f5c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2f5d0 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 72 65 65  ;    /* The tree
2f5e0 20 62 65 69 6e 67 20 63 68 65 63 6b 65 64 20 6f   being checked o
2f5f0 75 74 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  ut */.  Pager *p
2f600 50 61 67 65 72 3b 20 20 20 20 2f 2a 20 54 68 65  Pager;    /* The
2f610 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
2f620 72 2e 20 20 41 6c 73 6f 20 61 63 63 65 73 73 69  r.  Also accessi
2f630 62 6c 65 20 62 79 20 70 42 74 2d 3e 70 50 61 67  ble by pBt->pPag
2f640 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  er */.  int nPag
2f650 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
2f660 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2f670 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2f680 20 20 69 6e 74 20 2a 61 6e 52 65 66 3b 20 20 20    int *anRef;   
2f690 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f6a0 20 74 69 6d 65 73 20 65 61 63 68 20 70 61 67 65   times each page
2f6b0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20 2a   is referenced *
2f6c0 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 3b 20 20  /.  int mxErr;  
2f6d0 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 61 63        /* Stop ac
2f6e0 63 75 6d 75 6c 61 74 69 6e 67 20 65 72 72 6f 72  cumulating error
2f6f0 73 20 77 68 65 6e 20 74 68 69 73 20 72 65 61 63  s when this reac
2f700 68 65 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 68  hes zero */.  ch
2f710 61 72 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20  ar *zErrMsg;    
2f720 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73  /* An error mess
2f730 61 67 65 2e 20 20 4e 55 4c 4c 20 69 66 20 6e 6f  age.  NULL if no
2f740 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 20 2a 2f   errors seen. */
2f750 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
2f760 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f770 66 20 6d 65 73 73 61 67 65 73 20 77 72 69 74 74  f messages writt
2f780 65 6e 20 74 6f 20 7a 45 72 72 4d 73 67 20 73 6f  en to zErrMsg so
2f790 20 66 61 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e   far */.};..#ifn
2f7a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f7b0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
2f7c0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d  /*.** Append a m
2f7d0 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65 72  essage to the er
2f7e0 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
2f7f0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
2f800 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73  id checkAppendMs
2f810 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  g(.  IntegrityCk
2f820 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72   *pCheck,.  char
2f830 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74   *zMsg1,.  const
2f840 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a   char *zFormat,.
2f850 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69    ....){.  va_li
2f860 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2f870 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70 43 68  Msg2;.  if( !pCh
2f880 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74  eck->mxErr ) ret
2f890 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d  urn;.  pCheck->m
2f8a0 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b  xErr--;.  pCheck
2f8b0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73  ->nErr++;.  va_s
2f8c0 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2f8d0 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c  );.  zMsg2 = sql
2f8e0 69 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f  ite3VMPrintf(zFo
2f8f0 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
2f900 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
2f910 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20  Msg1==0 ) zMsg1 
2f920 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65  = "";.  if( pChe
2f930 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ck->zErrMsg ){. 
2f940 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20     char *zOld = 
2f950 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b  pCheck->zErrMsg;
2f960 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72  .    pCheck->zEr
2f970 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71  rMsg = 0;.    sq
2f980 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
2f990 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
2f9a0 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73   zOld, "\n", zMs
2f9b0 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
2f9c0 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)0);.    sqlite
2f9d0 46 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65  Free(zOld);.  }e
2f9e0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2f9f0 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63  SetString(&pChec
2fa00 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67  k->zErrMsg, zMsg
2fa10 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a  1, zMsg2, (char*
2fa20 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  )0);.  }.  sqlit
2fa30 65 46 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a  eFree(zMsg2);.}.
2fa40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2fa50 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
2fa60 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65  CHECK */..#ifnde
2fa70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2fa80 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
2fa90 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65  .** Add 1 to the
2faa0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2fab0 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e   for page iPage.
2fac0 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
2fad0 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72   second.** refer
2fae0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
2faf0 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
2fb00 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b  essage to pCheck
2fb10 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65  ->zErrMsg..** Re
2fb20 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
2fb30 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72  are 2 ore more r
2fb40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2fb50 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a   page and 0 if.*
2fb60 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
2fb70 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65   first reference
2fb80 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   to the page..**
2fb90 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  .** Also check t
2fba0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
2fbb0 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73  ber is in bounds
2fbc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fbd0 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69  checkRef(Integri
2fbe0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e  tyCk *pCheck, in
2fbf0 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a  t iPage, char *z
2fc00 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20  Context){.  if( 
2fc10 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
2fc20 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65  n 1;.  if( iPage
2fc30 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c  >pCheck->nPage |
2fc40 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20  | iPage<0 ){.   
2fc50 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
2fc60 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
2fc70 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20  , "invalid page 
2fc80 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67  number %d", iPag
2fc90 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
2fca0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65  ;.  }.  if( pChe
2fcb0 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
2fcc0 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ==1 ){.    check
2fcd0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
2fce0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64  , zContext, "2nd
2fcf0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2fd00 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
2fd10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2fd20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68  }.  return  (pCh
2fd30 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
2fd40 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64  ]++)>1;.}..#ifnd
2fd50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fd60 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2fd70 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65  Check that the e
2fd80 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
2fd90 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65  ter-map for page
2fda0 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20   iChild maps to 
2fdb0 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74  .** page iParent
2fdc0 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70  , pointer type p
2fdd0 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20  trType. If not, 
2fde0 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20  append an error 
2fdf0 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43  message.** to pC
2fe00 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  heck..*/.static 
2fe10 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70  void checkPtrmap
2fe20 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
2fe30 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e  *pCheck,   /* In
2fe40 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f  tegrity check co
2fe50 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  ntext */.  Pgno 
2fe60 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20  iChild,         
2fe70 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20    /* Child page 
2fe80 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65  number */.  u8 e
2fe90 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
2fea0 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70     /* Expected p
2feb0 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20  ointer map type 
2fec0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e  */.  Pgno iParen
2fed0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  t,          /* E
2fee0 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
2fef0 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20  map parent page 
2ff00 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
2ff10 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
2ff20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65     /* Context de
2ff30 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20  scription (used 
2ff40 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a  for error msg) *
2ff50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2ff60 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b   u8 ePtrmapType;
2ff70 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50  .  Pgno iPtrmapP
2ff80 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70  arent;..  rc = p
2ff90 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d  trmapGet(pCheck-
2ffa0 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65  >pBt, iChild, &e
2ffb0 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74  PtrmapType, &iPt
2ffc0 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  rmapParent);.  i
2ffd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ffe0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
2fff0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
30000 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64  Context, "Failed
30010 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20   to read ptrmap 
30020 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29  key=%d", iChild)
30030 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
30040 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70  }..  if( ePtrmap
30050 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69  Type!=eType || i
30060 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50  PtrmapParent!=iP
30070 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65  arent ){.    che
30080 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
30090 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  ck, zContext, . 
300a0 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61       "Bad ptr ma
300b0 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65  p entry key=%d e
300c0 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20  xpected=(%d,%d) 
300d0 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20  got=(%d,%d)", . 
300e0 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79       iChild, eTy
300f0 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74  pe, iParent, ePt
30100 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61  rmapType, iPtrma
30110 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
30120 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
30130 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
30140 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
30150 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  t or of an overf
30160 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  low page list..*
30170 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
30180 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
30190 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73  s on the list is
301a0 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   N..*/.static vo
301b0 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20  id checkList(.  
301c0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
301d0 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69  eck,  /* Integri
301e0 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74  ty checking cont
301f0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46  ext */.  int isF
30200 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  reeList,       /
30210 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65  * True for a fre
30220 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f  elist.  False fo
30230 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  r overflow page 
30240 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50  list */.  int iP
30250 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
30260 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
30270 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e  or first page in
30280 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69   the list */.  i
30290 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
302a0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
302b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
302c0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
302d0 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74    char *zContext
302e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
302f0 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
30300 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sages */.){.  in
30310 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63  t i;.  int expec
30320 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69  ted = N;.  int i
30330 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20  First = iPage;. 
30340 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20   while( N-- > 0 
30350 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
30360 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
30370 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75  pOvflPage;.    u
30380 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f  nsigned char *pO
30390 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28  vflData;.    if(
303a0 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20   iPage<1 ){.    
303b0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
303c0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
303d0 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20  t,.         "%d 
303e0 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73  of %d pages miss
303f0 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f  ing from overflo
30400 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  w list starting 
30410 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  at %d",.        
30420 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c    N+1, expected,
30430 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
30440 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
30450 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
30460 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f  heck, iPage, zCo
30470 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a  ntext) ) break;.
30480 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
30490 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e  agerGet(pCheck->
304a0 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50  pPager, (Pgno)iP
304b0 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29  age, &pOvflPage)
304c0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
304d0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
304e0 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c   zContext, "fail
304f0 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25  ed to get page %
30500 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
30510 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
30520 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28     pOvflData = (
30530 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
30540 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
30550 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ata(pOvflPage);.
30560 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69      if( isFreeLi
30570 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
30580 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  n = get4byte(&pO
30590 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66  vflData[4]);.#if
305a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
305b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
305c0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
305d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
305e0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
305f0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61  rmap(pCheck, iPa
30600 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
30610 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
30620 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
30630 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43  f.      if( n>pC
30640 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  heck->pBt->usabl
30650 65 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20  eSize/4-8 ){.   
30660 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
30670 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30680 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
30690 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20   "freelist leaf 
306a0 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e  count too big on
306b0 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
306c0 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a  );.        N--;.
306d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
306e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
306f0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
30700 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67     Pgno iFreePag
30710 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f  e = get4byte(&pO
30720 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  vflData[8+i*4]);
30730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30740 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
30760 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
30770 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
30780 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
30790 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
307a0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
307b0 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74  AGE, 0, zContext
307c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  );.          }.#
307d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
307e0 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c  checkRef(pCheck,
307f0 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e   iFreePage, zCon
30800 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  text);.        }
30810 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b  .        N -= n;
30820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
30830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30840 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30850 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
30860 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
30870 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
30880 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65  vacuum and iPage
30890 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
308a0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69  .      ** page i
308b0 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  n this overflow 
308c0 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74  list, check that
308d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
308e0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20   entry for.     
308f0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
30900 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69  g page matches i
30910 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Page..      */. 
30920 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d       if( pCheck-
30930 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
30940 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20   && N>0 ){.     
30950 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28     i = get4byte(
30960 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20  pOvflData);.    
30970 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
30980 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41  pCheck, i, PTRMA
30990 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61  P_OVERFLOW2, iPa
309a0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
309b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
309c0 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20  dif.    iPage = 
309d0 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
309e0 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
309f0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
30a00 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Page);.  }.}.#en
30a10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
30a20 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
30a30 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
30a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
30a50 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
30a60 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69   Do various sani
30a70 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73  ty checks on a s
30a80 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20  ingle page of a 
30a90 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tree.  Return.**
30aa0 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e   the tree depth.
30ab0 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74    Root pages ret
30ac0 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20  urn 0.  Parents 
30ad0 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a  of root pages.**
30ae0 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73   return 1, and s
30af0 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  o forth..** .** 
30b00 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65  These checks are
30b10 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   done:.**.**    
30b20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    1.  Make sure 
30b30 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66  that cells and f
30b40 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74  reeblocks do not
30b50 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20   overlap.**     
30b60 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65       but combine
30b70 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63   to completely c
30b80 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a  over the page..*
30b90 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20  *  NO  2.  Make 
30ba0 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61  sure cell keys a
30bb0 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20  re in order..** 
30bc0 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75   NO  3.  Make su
30bd0 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73  re no key is les
30be0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
30bf0 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a  to zLowerBound..
30c00 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65  **  NO  4.  Make
30c10 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20   sure no key is 
30c20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
30c30 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42  equal to zUpperB
30c40 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e  ound..**      5.
30c50 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65    Check the inte
30c60 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f  grity of overflo
30c70 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20  w pages..**     
30c80 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79   6.  Recursively
30c90 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50   call checkTreeP
30ca0 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64  age on all child
30cb0 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20  ren..**      7. 
30cc0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
30cd0 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68   depth of all ch
30ce0 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61  ildren is the sa
30cf0 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20  me..**      8.  
30d00 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70  Make sure this p
30d10 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  age is at least 
30d20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65  33% full or else
30d30 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20   it is.**       
30d40 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74     the root of t
30d50 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  he tree..*/.stat
30d60 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65  ic int checkTree
30d70 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74  Page(.  Integrit
30d80 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
30d90 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65   Context for the
30da0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f   sanity check */
30db0 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
30dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
30dd0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
30de0 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  age to check */.
30df0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
30e00 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
30e10 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72  t page */.  char
30e20 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74   *zParentContext
30e30 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74    /* Parent cont
30e40 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ext */.){.  MemP
30e50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
30e60 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20  t i, rc, depth, 
30e70 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20  d2, pgno, cnt;. 
30e80 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74   int hdr, cellSt
30e90 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  art;.  int nCell
30ea0 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20  ;.  u8 *data;.  
30eb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
30ec0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
30ed0 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74  .  char zContext
30ee0 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68  [100];.  char *h
30ef0 69 74 3b 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a  it;..  sprintf(z
30f00 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25  Context, "Page %
30f10 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20  d: ", iPage);.. 
30f20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
30f30 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20  he page exists. 
30f40 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65   */.  pBt = pChe
30f50 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c  ck->pBt;.  usabl
30f60 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
30f70 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  bleSize;.  if( i
30f80 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
30f90 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   0;.  if( checkR
30fa0 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
30fb0 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74  , zParentContext
30fc0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
30fd0 69 66 28 20 28 72 63 20 3d 20 67 65 74 50 61 67  if( (rc = getPag
30fe0 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61  e(pBt, (Pgno)iPa
30ff0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
31000 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
31010 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31020 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
31030 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74    "unable to get
31040 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72   the page. error
31050 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a   code=%d", rc);.
31060 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
31070 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 69 6e  }.  if( (rc = in
31080 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
31090 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20  arent))!=0 ){.  
310a0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
310b0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
310c0 74 2c 20 22 69 6e 69 74 50 61 67 65 28 29 20 72  t, "initPage() r
310d0 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64  eturns error cod
310e0 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e %d", rc);.    
310f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31100 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
31110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
31120 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65  k out all the ce
31130 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74  lls..  */.  dept
31140 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
31150 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
31160 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
31170 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  r; i++){.    u8 
31180 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
31190 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  sz;.    CellInfo
311a0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43   info;..    /* C
311b0 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65  heck payload ove
311c0 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
311d0 2a 2f 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  */.    sprintf(z
311e0 43 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 74 72 65  Context, "On tre
311f0 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
31200 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
31210 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
31220 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
31230 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
31240 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
31250 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
31260 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
31270 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
31280 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e  ey ) sz += info.
31290 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74  nKey;.    assert
312a0 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ( sz==info.nPayl
312b0 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73  oad );.    if( s
312c0 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  z>info.nLocal ){
312d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
312e0 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c   = (sz - info.nL
312f0 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a  ocal + usableSiz
31300 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69  e - 5)/(usableSi
31310 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50  ze - 4);.      P
31320 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
31330 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
31340 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
31350 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31360 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31370 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
31380 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
31390 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
313a0 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66  (pCheck, pgnoOvf
313b0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
313c0 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW1, iPage, zCon
313d0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
313e0 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63  endif.      chec
313f0 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c  kList(pCheck, 0,
31400 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65   pgnoOvfl, nPage
31410 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
31420 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
31430 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20   sanity of left 
31440 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
31450 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
31460 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
31470 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
31480 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  (pCell);.#ifndef
31490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
314a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
314b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
314c0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
314d0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
314e0 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
314f0 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  REE, iPage, zCon
31500 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
31510 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d  endif.      d2 =
31520 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
31530 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65  Check,pgno,pPage
31540 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ,zContext);.    
31550 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21    if( i>0 && d2!
31560 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  =depth ){.      
31570 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
31580 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
31590 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64  t, "Child page d
315a0 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a  epth differs");.
315b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
315c0 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a  pth = d2;.    }.
315d0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
315e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
315f0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
31600 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
31610 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
31620 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 43  ;.    sprintf(zC
31630 6f 6e 74 65 78 74 2c 20 22 4f 6e 20 70 61 67 65  ontext, "On page
31640 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68 69   %d at right chi
31650 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 23  ld: ", iPage);.#
31660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31670 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31680 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31690 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 63  acuum ){.      c
316a0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
316b0 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  k, pgno, PTRMAP_
316c0 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30 29  BTREE, iPage, 0)
316d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
316e0 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
316f0 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70  (pCheck, pgno, p
31700 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31710 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63  .  }. .  /* Chec
31720 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63  k for complete c
31730 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20 70  overage of the p
31740 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20  age.  */.  data 
31750 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
31760 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
31770 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74 20  drOffset;.  hit 
31780 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
31790 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
317a0 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20 6d  if( hit ){.    m
317b0 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65  emset(hit, 1, ge
317c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
317d0 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  +5]));.    nCell
317e0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
317f0 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63  a[hdr+3]);.    c
31800 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b  ellStart = hdr +
31810 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
31820 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eaf;.    for(i=0
31830 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
31840 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20  .      int pc = 
31850 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
31860 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a  ellStart+i*2]);.
31870 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
31880 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
31890 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
318a0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
318b0 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d     if( (pc+size-
318c0 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
318d0 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  | pc<0 ){.      
318e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
318f0 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
31900 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
31910 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
31920 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
31930 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
31940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31950 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73        for(j=pc+s
31960 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d  ize-1; j>=pc; j-
31970 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
31980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
31990 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32  or(cnt=0, i=get2
319a0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
319b0 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61  ]); i>0 && i<usa
319c0 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31  bleSize && cnt<1
319d0 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20  0000; .         
319e0 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20    cnt++){.      
319f0 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62  int size = get2b
31a00 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b  yte(&data[i+2]);
31a10 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
31a20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d      if( (i+size-
31a30 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  1)>=usableSize |
31a40 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  | i<0 ){.       
31a50 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31a60 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20  pCheck, 0,  .   
31a70 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70           "Corrup
31a80 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e  tion detected in
31a90 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65   cell %d on page
31aa0 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b   %d",i,iPage,0);
31ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31ac0 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69        for(j=i+si
31ad0 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29  ze-1; j>=i; j--)
31ae0 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20   hit[j]++;.     
31af0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74   }.      i = get
31b00 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b  2byte(&data[i]);
31b10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
31b20 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65  =cnt=0; i<usable
31b30 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Size; i++){.    
31b40 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20    if( hit[i]==0 
31b50 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  ){.        cnt++
31b60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
31b70 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20  ( hit[i]>1 ){.  
31b80 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
31b90 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a  dMsg(pCheck, 0,.
31ba0 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69            "Multi
31bb0 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74  ple uses for byt
31bc0 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22  e %d of page %d"
31bd0 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  , i, iPage);.   
31be0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
31c00 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b  ( cnt!=data[hdr+
31c10 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  7] ){.      chec
31c20 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31c30 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
31c40 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61   "Fragmented spa
31c50 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65  ce is %d byte re
31c60 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20  ported as %d on 
31c70 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20  page %d",.      
31c80 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64      cnt, data[hd
31c90 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  r+7], iPage);.  
31ca0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
31cb0 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65  Free(hit);..  re
31cc0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
31cd0 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68  ;.  return depth
31ce0 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  +1;.}.#endif /* 
31cf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31d00 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
31d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31d20 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31d30 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECK./*.** This r
31d40 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f  outine does a co
31d50 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20  mplete check of 
31d60 74 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20  the given BTree 
31d70 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69  file.  aRoot[] i
31d80 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66  s.** an array of
31d90 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77   pages numbers w
31da0 65 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75  ere each page nu
31db0 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74  mber is the root
31dc0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61   page of.** a ta
31dd0 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74  ble.  nRoot is t
31de0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
31df0 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a  ries in aRoot..*
31e00 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
31e10 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74  ng checks out, t
31e20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
31e30 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f  rns NULL.  If so
31e40 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d  mething is.** am
31e50 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  iss, an error me
31e60 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
31e70 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
31e80 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
31e90 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69  c().** and a poi
31ea0 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65 72 72  nter to that err
31eb0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 72 65  or message is re
31ec0 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c  turned.  The cal
31ed0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
31ee0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
31ef0 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
31f00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
31f10 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
31f20 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  /.char *sqlite3B
31f30 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
31f40 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  ck(.  Btree *p, 
31f50 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
31f60 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a   to be checked *
31f70 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20  /.  int *aRoot, 
31f80 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
31f90 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62   root pages numb
31fa0 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75  ers for individu
31fb0 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e  al trees */.  in
31fc0 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e  t nRoot,    /* N
31fd0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
31fe0 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20   in aRoot[] */. 
31ff0 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f   int mxErr,    /
32000 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67  * Stop reporting
32010 20 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68   errors after th
32020 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74  is many */.  int
32030 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72   *pnErr    /* Wr
32040 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  ite number of er
32050 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69  rors seen to thi
32060 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b  s variable */.){
32070 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
32080 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74  nRef;.  Integrit
32090 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74  yCk sCheck;.  Bt
320a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
320b0 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20  >pBt;..  nRef = 
320c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
320d0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
320e0 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72  );.  if( lockBtr
320f0 65 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d  eeWithRetry(p)!=
32100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32110 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53 74   return sqliteSt
32120 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20  rDup("Unable to 
32130 61 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c  acquire a read l
32140 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32150 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68  ase");.  }.  sCh
32160 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  eck.pBt = pBt;. 
32170 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d   sCheck.pPager =
32180 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
32190 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73  sCheck.nPage = s
321a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
321b0 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67  ount(sCheck.pPag
321c0 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78  er);.  sCheck.mx
321d0 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73  Err = mxErr;.  s
321e0 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a  Check.nErr = 0;.
321f0 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 20 20    *pnErr = 0;.  
32200 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
32210 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
32220 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
32230 42 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Bt);.    return 
32240 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  0;.  }.  sCheck.
32250 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61  anRef = sqliteMa
32260 6c 6c 6f 63 52 61 77 28 20 28 73 43 68 65 63 6b  llocRaw( (sCheck
32270 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
32280 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
32290 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65  ) );.  if( !sChe
322a0 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20  ck.anRef ){.    
322b0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
322c0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  sed(pBt);.    *p
322d0 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 72 65  nErr = 1;.    re
322e0 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69  turn sqlite3MPri
322f0 6e 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d  ntf("Unable to m
32300 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c  alloc %d bytes",
32310 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63   .        (sChec
32320 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
32330 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
32340 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ]));.  }.  for(i
32350 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
32360 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
32370 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
32380 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
32390 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
323a0 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
323b0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
323c0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
323d0 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a  ;.  }.  sCheck.z
323e0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f  ErrMsg = 0;..  /
323f0 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
32400 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
32410 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65  elist.  */.  che
32420 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20  ckList(&sCheck, 
32430 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74  1, get4byte(&pBt
32440 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
32450 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  32]),.          
32460 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d    get4byte(&pBt-
32470 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
32480 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c  6]), "Main freel
32490 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43  ist: ");..  /* C
324a0 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62  heck all the tab
324b0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
324c0 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20  i=0; i<nRoot && 
324d0 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
324e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f  +){.    if( aRoo
324f0 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  t[i]==0 ) contin
32500 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
32510 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32520 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
32530 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52  autoVacuum && aR
32540 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  oot[i]>1 ){.    
32550 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73    checkPtrmap(&s
32560 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
32570 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
32580 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
32590 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
325a0 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c  reePage(&sCheck,
325b0 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c   aRoot[i], 0, "L
325c0 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74  ist of tree root
325d0 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s: ");.  }..  /*
325e0 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
325f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
32600 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a  e is referenced.
32610 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
32620 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
32630 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
32640 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
32650 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32660 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68  CUUM.    if( sCh
32670 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32680 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
32690 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
326a0 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
326b0 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
326c0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
326d0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
326e0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
326f0 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73  o-vacuum, make s
32700 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f  ure no tables co
32710 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66  ntain.    ** ref
32720 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74  erences to point
32730 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20  er-map pages..  
32740 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68    */.    if( sCh
32750 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
32760 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
32770 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
32780 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75  )!=i || !pBt->au
32790 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
327a0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
327b0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
327c0 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
327d0 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
327e0 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
327f0 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a  anRef[i]!=0 && .
32800 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
32810 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69  AGENO(pBt, i)==i
32820 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   && pBt->autoVac
32830 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
32840 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
32850 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65  heck, 0, "Pointe
32860 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73  r map page %d is
32870 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29   referenced", i)
32880 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32890 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
328a0 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  re this analysis
328b0 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61   did not leave a
328c0 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73  ny unref() pages
328d0 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74  .  */.  unlockBt
328e0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
328f0 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20  ;.  if( nRef != 
32900 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
32910 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
32920 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  ) ){.    checkAp
32930 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
32940 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73   0, .      "Outs
32950 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75  tanding page cou
32960 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20  nt goes from %d 
32970 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69  to %d during thi
32980 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20  s analysis",.   
32990 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33     nRef, sqlite3
329a0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
329b0 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29  t->pPager).    )
329c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
329d0 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74  n  up and report
329e0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
329f0 73 71 6c 69 74 65 46 72 65 65 28 73 43 68 65 63  sqliteFree(sChec
32a00 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45  k.anRef);.  *pnE
32a10 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
32a20 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63  ;.  return sChec
32a30 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e  k.zErrMsg;.}.#en
32a40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
32a50 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
32a60 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
32a70 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
32a80 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
32a90 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
32aa0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
32ab0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
32ac0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74  eeGetFilename(Bt
32ad0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
32ae0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
32af0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
32b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
32b10 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  ename(p->pBt->pP
32b20 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
32b30 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
32b40 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
32b50 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
32b60 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
32b70 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
32b80 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
32b90 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65  eGetDirname(Btre
32ba0 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
32bb0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
32bc0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
32bd0 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
32be0 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
32bf0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
32c00 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
32c10 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
32c20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61  file for this da
32c30 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75  tabase. The retu
32c40 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  rn.** value of t
32c50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
32c60 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65  he same regardle
32c70 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
32c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
32c90 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
32ca0 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f  ed or not..*/.co
32cb0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
32cc0 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
32cd0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
32ce0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
32cf0 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
32d00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
32d10 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
32d20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
32d30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
32d40 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
32d50 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
32d60 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
32d70 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
32d80 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
32d90 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
32da0 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
32db0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
32dc0 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42   size of file pB
32dd0 74 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64  tFrom may be red
32de0 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  uced by this ope
32df0 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e  ration..** If an
32e00 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
32e10 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  g, the transacti
32e20 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73  on on pBtFrom is
32e30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
32e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
32e50 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20  eCopyFile(Btree 
32e60 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72  *pTo, Btree *pFr
32e70 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  om){.  int rc = 
32e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e  SQLITE_OK;.  Pgn
32e90 6f 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50  o i, nPage, nToP
32ea0 61 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42  age, iSkip;..  B
32eb0 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d  tShared *pBtTo =
32ec0 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53   pTo->pBt;.  BtS
32ed0 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d  hared *pBtFrom =
32ee0 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20   pFrom->pBt;..  
32ef0 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73  if( pTo->inTrans
32f00 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
32f10 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21   pFrom->inTrans!
32f20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
32f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32f40 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
32f50 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f  f( pBtTo->pCurso
32f60 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
32f70 45 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67  E_BUSY;.  nToPag
32f80 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
32f90 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d  Pagecount(pBtTo-
32fa0 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67  >pPager);.  nPag
32fb0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
32fc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f  Pagecount(pBtFro
32fd0 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53  m->pPager);.  iS
32fe0 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  kip = PENDING_BY
32ff0 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a  TE_PAGE(pBtTo);.
33000 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
33010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e  QLITE_OK && i<=n
33020 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
33030 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
33040 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69  .    if( i==iSki
33050 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
33060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33070 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e  gerGet(pBtFrom->
33080 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50  pPager, i, &pDbP
33090 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
330a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63   ) break;.    rc
330b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
330c0 76 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e  verwrite(pBtTo->
330d0 70 50 61 67 65 72 2c 20 69 2c 20 73 71 6c 69 74  pPager, i, sqlit
330e0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
330f0 44 62 50 61 67 65 29 29 3b 0a 20 20 20 20 73 71  DbPage));.    sq
33100 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
33110 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
33120 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72  for(i=nPage+1; r
33130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33140 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29  i<=nToPage; i++)
33150 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33160 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33170 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33180 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33190 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
331a0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
331b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
331c0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
331d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
331e0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
331f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
33200 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
33210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
33220 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 42 74  gerDontWrite(pBt
33230 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 29 3b 0a  To->pPager, i);.
33240 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26    }.  if( !rc &&
33250 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29   nPage<nToPage )
33260 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
33270 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
33280 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e  pBtTo->pPager, n
33290 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
332a0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
332b0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
332c0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
332d0 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69  rn rc;  .}.#endi
332e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
332f0 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _VACUUM */../*.*
33300 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
33310 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  o if a transacti
33320 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
33330 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33340 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65  eIsInTrans(Btree
33350 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
33360 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
33370 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
33380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33390 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
333a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
333b0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
333c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
333d0 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
333e0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
333f0 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42  (p->pBt && p->pB
33400 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  t->inStmt);.}../
33410 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
33420 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28  zero if a read (
33430 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
33440 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
33450 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33460 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
33470 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  s(Btree *p){.  r
33480 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
33490 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
334a0 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ONE));.}../*.** 
334b0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
334c0 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
334d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
334e0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
334f0 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
33500 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
33510 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33520 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
33530 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
33540 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
33550 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
33560 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
33570 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
33580 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
33590 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
335a0 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
335b0 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
335c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
335d0 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
335e0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
335f0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
33600 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
33610 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
33620 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
33630 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
33640 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
33650 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
33660 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
33670 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
33680 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
33690 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
336a0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
336b0 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
336c0 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
336d0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
336e0 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
336f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
33700 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
33710 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
33720 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
33730 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
33740 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
33750 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33760 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
33770 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
33780 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
33790 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
337a0 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
337b0 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  nc = 0;.#ifndef 
337c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
337d0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
337e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
337f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
33800 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
33810 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20  t, &nTrunc); .  
33820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33850 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
33860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33870 33 50 61 67 65 72 53 79 6e 63 28 70 42 74 2d 3e  3PagerSync(pBt->
33880 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
33890 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 20 20   nTrunc);.  }.  
338a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
338b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
338c0 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
338d0 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66  ter to a blob of
338e0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
338f0 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e  ed with.** a sin
33900 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  gle shared-btree
33910 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20  . The memory is 
33920 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63  used by client c
33930 6f 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e  ode for it's own
33940 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f  .** purposes (fo
33950 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74  r example, to st
33960 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c  ore a high-level
33970 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74   schema associat
33980 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
33990 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54  shared-btree). T
339a0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
339b0 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65  anages reference
339c0 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73   counting issues
339d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
339e0 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
339f0 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65  alled on a share
33a00 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20  d-btree, nBytes 
33a10 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
33a20 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ** are allocated
33a30 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65  , zeroed, and re
33a40 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
33a50 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73  ller. For each s
33a60 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61  ubsequent .** ca
33a70 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  ll the nBytes pa
33a80 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
33a90 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ed and a pointer
33aa0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f   to the same blo
33ab0 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72  b.** of memory r
33ac0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
33ad0 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  Just before the 
33ae0 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20  shared-btree is 
33af0 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63  closed, the func
33b00 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  tion passed as t
33b10 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67  he .** xFree arg
33b20 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d  ument when the m
33b30 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
33b40 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76   was made is inv
33b50 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  oked on the .** 
33b60 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65  blob of allocate
33b70 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66  d memory. This f
33b80 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
33b90 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72  ot call sqliteFr
33ba0 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ee().** on the m
33bb0 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65  emory, the btree
33bc0 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74   layer does that
33bd0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
33be0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74  e3BtreeSchema(Bt
33bf0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  ree *p, int nByt
33c00 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29  es, void(*xFree)
33c10 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53  (void *)){.  BtS
33c20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
33c30 70 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  pBt;.  if( !pBt-
33c40 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
33c50 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73  pBt->pSchema = s
33c60 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74  qliteMalloc(nByt
33c70 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46  es);.    pBt->xF
33c80 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65  reeSchema = xFre
33c90 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
33ca0 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a  pBt->pSchema;.}.
33cb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
33cc0 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73  ue if another us
33cd0 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73  er of the same s
33ce0 68 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74  hared btree as t
33cf0 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68  he argument.** h
33d00 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65  andle holds an e
33d10 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
33d20 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
33d30 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  er table..*/.int
33d40 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
33d50 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20  emaLocked(Btree 
33d60 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 71  *p){.  return (q
33d70 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
33d80 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
33d90 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45  AD_LOCK)!=SQLITE
33da0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  _OK);.}...#ifnde
33db0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
33dc0 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
33dd0 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
33de0 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73  n the table whos
33df0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69  e root page is i
33e00 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63  Tab.  The.** loc
33e10 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63  k is a write loc
33e20 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b  k if isWritelock
33e30 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65   is true or a re
33e40 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74  ad lock.** if it
33e50 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e   is false..*/.in
33e60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
33e70 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
33e80 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69  , int iTab, u8 i
33e90 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69  sWriteLock){.  i
33ea0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33eb0 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65  K;.  u8 lockType
33ec0 20 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f   = (isWriteLock?
33ed0 57 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f  WRITE_LOCK:READ_
33ee0 4c 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75  LOCK);.  rc = qu
33ef0 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
33f00 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  iTab, lockType);
33f10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
33f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
33f30 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54   lockTable(p, iT
33f40 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20  ab, lockType);. 
33f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33f60 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
33f70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
33f80 62 75 67 67 69 6e 67 20 69 6e 74 65 72 66 61 63  bugging interfac
33f90 65 20 68 61 73 20 74 6f 20 62 65 20 69 6e 20 74  e has to be in t
33fa0 68 69 73 20 66 69 6c 65 20 28 72 61 74 68 65 72  his file (rather
33fb0 0a 2a 2a 20 74 68 61 6e 20 69 6e 2c 20 66 6f 72  .** than in, for
33fc0 20 65 78 61 6d 70 6c 65 2c 20 74 65 73 74 31 2e   example, test1.
33fd0 63 29 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  c) so that it ca
33fe0 6e 20 67 65 74 20 61 63 63 65 73 73 20 74 6f 0a  n get access to.
33ff0 2a 2a 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ** the definitio
34000 6e 20 6f 66 20 42 74 53 68 61 72 65 64 2e 0a 2a  n of BtShared..*
34010 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
34020 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
34030 65 66 69 6e 65 64 28 54 43 4c 53 48 29 0a 23 69  efined(TCLSH).#i
34040 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 69  nclude <tcl.h>.i
34050 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 61 72 65  nt sqlite3_share
34060 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 28 0a  d_cache_report(.
34070 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
34080 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
34090 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
340a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
340b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
340c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
340d0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
340e0 48 45 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  HE.  const Threa
340f0 64 44 61 74 61 20 2a 70 54 64 20 3d 20 73 71 6c  dData *pTd = sql
34100 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
34110 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20  adOnly();.  if( 
34120 70 54 64 2d 3e 75 73 65 53 68 61 72 65 64 44 61  pTd->useSharedDa
34130 74 61 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  ta ){.    BtShar
34140 65 64 20 2a 70 42 74 3b 0a 20 20 20 20 54 63 6c  ed *pBt;.    Tcl
34150 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
34160 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 66  _NewObj();.    f
34170 6f 72 28 70 42 74 3d 70 54 64 2d 3e 70 42 74 72  or(pBt=pTd->pBtr
34180 65 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  ee; pBt; pBt=pBt
34190 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
341a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
341b0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
341c0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
341d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 54 63 6c  ager);.      Tcl
341e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
341f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
34200 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
34210 67 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31 29 29  gObj(zFile, -1))
34220 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  ;.      Tcl_List
34230 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
34240 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
34250 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 42 74  cl_NewIntObj(pBt
34260 2d 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20 7d 0a  ->nRef));.    }.
34270 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
34280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
34290 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
342a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
342b0 7d 0a 23 65 6e 64 69 66 0a                       }.#endif.