/ Hex Artifact Content
Login

Artifact abdbd0261d2ab4fed65332cc93f959906c185d22:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 36 32 20 32 30 30 37 2f 30  c,v 1.362 2007/0
0190: 34 2f 33 30 20 31 36 3a 35 35 3a 30 31 20 64 61  4/30 16:55:01 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 46 6f 72  g BTrees..** For
0200: 20 61 20 64 65 74 61 69 6c 65 64 20 64 69 73 63   a detailed disc
0210: 75 73 73 69 6f 6e 20 6f 66 20 42 54 72 65 65 73  ussion of BTrees
0220: 2c 20 72 65 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a  , refer to.**.**
0230: 20 20 20 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b       Donald E. K
0240: 6e 75 74 68 2c 20 54 48 45 20 41 52 54 20 4f 46  nuth, THE ART OF
0250: 20 43 4f 4d 50 55 54 45 52 20 50 52 4f 47 52 41   COMPUTER PROGRA
0260: 4d 4d 49 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a  MMING, Volume 3:
0270: 0a 2a 2a 20 20 20 20 20 22 53 6f 72 74 69 6e 67  .**     "Sorting
0280: 20 41 6e 64 20 53 65 61 72 63 68 69 6e 67 22 2c   And Searching",
0290: 20 70 61 67 65 73 20 34 37 33 2d 34 38 30 2e 20   pages 473-480. 
02a0: 41 64 64 69 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a  Addison-Wesley.*
02b0: 2a 20 20 20 20 20 50 75 62 6c 69 73 68 69 6e 67  *     Publishing
02c0: 20 43 6f 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e   Company, Readin
02d0: 67 2c 20 4d 61 73 73 61 63 68 75 73 65 74 74 73  g, Massachusetts
02e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
02f0: 63 20 69 64 65 61 20 69 73 20 74 68 61 74 20 65  c idea is that e
0300: 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20  ach page of the 
0310: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20  file contains N 
0320: 64 61 74 61 62 61 73 65 0a 2a 2a 20 65 6e 74 72  database.** entr
0330: 69 65 73 20 61 6e 64 20 4e 2b 31 20 70 6f 69 6e  ies and N+1 poin
0340: 74 65 72 73 20 74 6f 20 73 75 62 70 61 67 65 73  ters to subpages
0350: 2e 0a 2a 2a 0a 2a 2a 20 20 20 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 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
03a0: 7c 20 20 50 74 72 28 30 29 20 7c 20 4b 65 79 28  |  Ptr(0) | Key(
03b0: 30 29 20 7c 20 50 74 72 28 31 29 20 7c 20 4b 65  0) | Ptr(1) | Ke
03c0: 79 28 31 29 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79  y(1) | ... | Key
03d0: 28 4e 2d 31 29 20 7c 20 50 74 72 28 4e 29 20 7c  (N-1) | Ptr(N) |
03e0: 0a 2a 2a 20 20 20 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 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ------.**.** All
0430: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e 20   of the keys on 
0440: 74 68 65 20 70 61 67 65 20 74 68 61 74 20 50 74  the page that Pt
0450: 72 28 30 29 20 70 6f 69 6e 74 73 20 74 6f 20 68  r(0) points to h
0460: 61 76 65 20 76 61 6c 75 65 73 20 6c 65 73 73 0a  ave values less.
0470: 2a 2a 20 74 68 61 6e 20 4b 65 79 28 30 29 2e 20  ** than Key(0). 
0480: 20 41 6c 6c 20 6f 66 20 74 68 65 20 6b 65 79 73   All of the keys
0490: 20 6f 6e 20 70 61 67 65 20 50 74 72 28 31 29 20   on page Ptr(1) 
04a0: 61 6e 64 20 69 74 73 20 73 75 62 70 61 67 65 73  and its subpages
04b0: 20 68 61 76 65 0a 2a 2a 20 76 61 6c 75 65 73 20   have.** values 
04c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 4b 65 79  greater than Key
04d0: 28 30 29 20 61 6e 64 20 6c 65 73 73 20 74 68 61  (0) and less tha
04e0: 6e 20 4b 65 79 28 31 29 2e 20 20 41 6c 6c 20 6f  n Key(1).  All o
04f0: 66 20 74 68 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e  f the keys.** on
0500: 20 50 74 72 28 4e 29 20 61 6e 64 20 69 74 73 20   Ptr(N) and its 
0510: 73 75 62 70 61 67 65 73 20 68 61 76 65 20 76 61  subpages have va
0520: 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
0530: 6e 20 4b 65 79 28 4e 2d 31 29 2e 20 20 41 6e 64  n Key(N-1).  And
0540: 0a 2a 2a 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  .** so forth..**
0550: 0a 2a 2a 20 46 69 6e 64 69 6e 67 20 61 20 70 61  .** Finding a pa
0560: 72 74 69 63 75 6c 61 72 20 6b 65 79 20 72 65 71  rticular key req
0570: 75 69 72 65 73 20 72 65 61 64 69 6e 67 20 4f 28  uires reading O(
0580: 6c 6f 67 28 4d 29 29 20 70 61 67 65 73 20 66 72  log(M)) pages fr
0590: 6f 6d 20 74 68 65 20 0a 2a 2a 20 64 69 73 6b 20  om the .** disk 
05a0: 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e  where M is the n
05b0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
05c0: 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
05d0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 69 6d 70 6c  .** In this impl
05e0: 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 73 69  ementation, a si
05f0: 6e 67 6c 65 20 66 69 6c 65 20 63 61 6e 20 68 6f  ngle file can ho
0600: 6c 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ld one or more s
0610: 65 70 61 72 61 74 65 20 0a 2a 2a 20 42 54 72 65  eparate .** BTre
0620: 65 73 2e 20 20 45 61 63 68 20 42 54 72 65 65 20  es.  Each BTree 
0630: 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
0640: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 69 74   the index of it
0650: 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68  s root page.  Th
0660: 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
0670: 61 20 66 6f 72 20 61 6e 79 20 65 6e 74 72 79 20  a for any entry 
0680: 61 72 65 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20  are combined to 
0690: 66 6f 72 6d 20 74 68 65 20 22 70 61 79 6c 6f 61  form the "payloa
06a0: 64 22 2e 20 20 41 0a 2a 2a 20 66 69 78 65 64 20  d".  A.** fixed 
06b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
06c0: 64 20 63 61 6e 20 62 65 20 63 61 72 72 69 65 64  d can be carried
06d0: 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65   directly on the
06e0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67   database.** pag
06f0: 65 2e 20 20 49 66 20 74 68 65 20 70 61 79 6c 6f  e.  If the paylo
0700: 61 64 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ad is larger tha
0710: 6e 20 74 68 65 20 70 72 65 73 65 74 20 61 6d 6f  n the preset amo
0720: 75 6e 74 20 74 68 65 6e 20 73 75 72 70 6c 75 73  unt then surplus
0730: 0a 2a 2a 20 62 79 74 65 73 20 61 72 65 20 73 74  .** bytes are st
0740: 6f 72 65 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  ored on overflow
0750: 20 70 61 67 65 73 2e 20 20 54 68 65 20 70 61 79   pages.  The pay
0760: 6c 6f 61 64 20 66 6f 72 20 61 6e 20 65 6e 74 72  load for an entr
0770: 79 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 65  y.** and the pre
0780: 63 65 64 69 6e 67 20 70 6f 69 6e 74 65 72 20 61  ceding pointer a
0790: 72 65 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66  re combined to f
07a0: 6f 72 6d 20 61 20 22 43 65 6c 6c 22 2e 20 20 45  orm a "Cell".  E
07b0: 61 63 68 20 0a 2a 2a 20 70 61 67 65 20 68 61 73  ach .** page has
07c0: 20 61 20 73 6d 61 6c 6c 20 68 65 61 64 65 72 20   a small header 
07d0: 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74  which contains t
07e0: 68 65 20 50 74 72 28 4e 29 20 70 6f 69 6e 74 65  he Ptr(N) pointe
07f0: 72 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69  r and other.** i
0800: 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20  nformation such 
0810: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b  as the size of k
0820: 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a  ey and data..**.
0830: 2a 2a 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c  ** FORMAT DETAIL
0840: 53 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  S.**.** The file
0850: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
0860: 20 70 61 67 65 73 2e 20 20 54 68 65 20 66 69 72   pages.  The fir
0870: 73 74 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65  st page is calle
0880: 64 20 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65  d page 1,.** the
0890: 20 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20   second is page 
08a0: 32 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  2, and so forth.
08b0: 20 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20    A page number 
08c0: 6f 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65  of zero indicate
08d0: 73 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61  s.** "no such pa
08e0: 67 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73  ge".  The page s
08f0: 69 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68  ize can be anyth
0900: 69 6e 67 20 62 65 74 77 65 65 6e 20 35 31 32 20  ing between 512 
0910: 61 6e 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61  and 65536..** Ea
0920: 63 68 20 70 61 67 65 20 63 61 6e 20 62 65 20 65  ch page can be e
0930: 69 74 68 65 72 20 61 20 62 74 72 65 65 20 70 61  ither a btree pa
0940: 67 65 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70  ge, a freelist p
0950: 61 67 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c  age or an overfl
0960: 6f 77 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ow.** page..**.*
0970: 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65  * The first page
0980: 20 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72   is always a btr
0990: 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69  ee page.  The fi
09a0: 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66  rst 100 bytes of
09b0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61   the first.** pa
09c0: 67 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65  ge contain a spe
09d0: 63 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65  cial header (the
09e0: 20 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20   "file header") 
09f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
0a00: 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20  he file..** The 
0a10: 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69  format of the fi
0a20: 6c 65 20 68 65 61 64 65 72 20 69 73 20 61 73 20  le header is as 
0a30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
0a40: 20 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 20   OFFSET   SIZE  
0a50: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
0a60: 20 20 20 20 20 20 30 20 20 20 20 20 20 31 36 20        0      16 
0a70: 20 20 20 20 48 65 61 64 65 72 20 73 74 72 69 6e      Header strin
0a80: 67 3a 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61  g: "SQLite forma
0a90: 74 20 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20  t 3\000".**     
0aa0: 31 36 20 20 20 20 20 20 20 32 20 20 20 20 20 50  16       2     P
0ab0: 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  age size in byte
0ac0: 73 2e 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20  s.  .**     18  
0ad0: 20 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20       1     File 
0ae0: 66 6f 72 6d 61 74 20 77 72 69 74 65 20 76 65 72  format write ver
0af0: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20  sion.**     19  
0b00: 20 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20       1     File 
0b10: 66 6f 72 6d 61 74 20 72 65 61 64 20 76 65 72 73  format read vers
0b20: 69 6f 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20  ion.**     20   
0b30: 20 20 20 20 31 20 20 20 20 20 42 79 74 65 73 20      1     Bytes 
0b40: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
0b50: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
0b60: 63 68 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32  ch page.**     2
0b70: 31 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 61  1       1     Ma
0b80: 78 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  x embedded paylo
0b90: 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20  ad fraction.**  
0ba0: 20 20 20 32 32 20 20 20 20 20 20 20 31 20 20 20     22       1   
0bb0: 20 20 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70    Min embedded p
0bc0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a  ayload fraction.
0bd0: 2a 2a 20 20 20 20 20 32 33 20 20 20 20 20 20 20  **     23       
0be0: 31 20 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70  1     Min leaf p
0bf0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a  ayload fraction.
0c00: 2a 2a 20 20 20 20 20 32 34 20 20 20 20 20 20 20  **     24       
0c10: 34 20 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67  4     File chang
0c20: 65 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20  e counter.**    
0c30: 20 32 38 20 20 20 20 20 20 20 34 20 20 20 20 20   28       4     
0c40: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
0c50: 75 72 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33  ure use.**     3
0c60: 32 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69  2       4     Fi
0c70: 72 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67  rst freelist pag
0c80: 65 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20  e.**     36     
0c90: 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f    4     Number o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73  f freelist pages
0cb0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
0cc0: 20 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20      40      60  
0cd0: 20 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74     15 4-byte met
0ce0: 61 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20  a values passed 
0cf0: 74 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  to higher layers
0d00: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
0d10: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
0d20: 20 61 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20   are big-endian 
0d30: 28 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e  (most significan
0d40: 74 20 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a  t byte first)..*
0d50: 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68  *.** The file ch
0d60: 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20  ange counter is 
0d70: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
0d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
0d90: 20 63 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a   changed more.**
0da0: 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69   than once withi
0db0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e  n the same secon
0dc0: 64 2e 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72  d.  This counter
0dd0: 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
0de0: 74 68 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74  the.** modificat
0df0: 69 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20  ion time of the 
0e00: 66 69 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68  file, allows oth
0e10: 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20  er processes to 
0e20: 6b 6e 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65  know.** when the
0e30: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
0e40: 64 20 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20  d and thus when 
0e50: 74 68 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75  they need to flu
0e60: 73 68 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68  sh their.** cach
0e70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
0e80: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
0e90: 64 20 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68  d fraction is th
0ea0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
0eb0: 74 6f 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20  total usable.** 
0ec0: 73 70 61 63 65 20 69 6e 20 61 20 70 61 67 65 20  space in a page 
0ed0: 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73  that can be cons
0ee0: 75 6d 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65  umed by a single
0ef0: 20 63 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61   cell for standa
0f00: 72 64 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f  rd.** B-tree (no
0f10: 6e 2d 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c  n-LEAFDATA) tabl
0f20: 65 73 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20  es.  A value of 
0f30: 32 35 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20  255 means 100%. 
0f40: 20 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   The default.** 
0f50: 69 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  is to limit the 
0f60: 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  maximum cell siz
0f70: 65 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  e so that at lea
0f80: 73 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20  st 4 cells will 
0f90: 66 69 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61  fit.** on one pa
0fa0: 67 65 2e 20 20 54 68 75 73 20 74 68 65 20 64 65  ge.  Thus the de
0fb0: 66 61 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64  fault max embedd
0fc0: 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  ed payload fract
0fd0: 69 6f 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a  ion is 64..**.**
0fe0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
0ff0: 66 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61  for a cell is la
1000: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  rger than the ma
1010: 78 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20  x payload, then 
1020: 65 78 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64  extra.** payload
1030: 20 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f   is spilled to o
1040: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
1050: 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1060: 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
1070: 65 64 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62  ed,.** as many b
1080: 79 74 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ytes as possible
1090: 20 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20   are moved into 
10a0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
10b0: 65 73 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69  es without letti
10c0: 6e 67 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73  ng.** the cell s
10d0: 69 7a 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74  ize drop below t
10e0: 68 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20  he min embedded 
10f0: 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20  ..**.** The min 
1110: 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61  leaf payload fra
1120: 63 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68  ction is like th
1130: 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70  e min embedded p
1140: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a  ayload fraction.
1150: 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ** except that i
1160: 74 20 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61  t applies to lea
1170: 66 20 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41  f nodes in a LEA
1180: 46 44 41 54 41 20 74 72 65 65 2e 20 20 54 68 65  FDATA tree.  The
1190: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c   maximum.** payl
11a0: 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72  oad fraction for
11b0: 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
11c0: 20 69 73 20 61 6c 77 61 79 73 20 31 30 30 25 20   is always 100% 
11d0: 28 6f 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a  (or 255) and it.
11e0: 2a 2a 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ** not specified
11f0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1200: 2a 2a 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65  **.** Each btree
1210: 20 70 61 67 65 73 20 69 73 20 64 69 76 69 64 65   pages is divide
1220: 64 20 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63  d into three sec
1230: 74 69 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64  tions:  The head
1240: 65 72 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20  er, the.** cell 
1250: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61  pointer array, a
1260: 6e 64 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61  nd the cell area
1270: 20 61 72 65 61 2e 20 20 50 61 67 65 20 31 20 61   area.  Page 1 a
1280: 6c 73 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79  lso has a 100-by
1290: 74 65 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65  te.** file heade
12a0: 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65  r that occurs be
12b0: 66 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65  fore the page he
12c0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ader..**.**     
12d0: 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   |--------------
12e0: 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69  --|.**      | fi
12f0: 6c 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20  le header    |  
1300: 20 31 30 30 20 62 79 74 65 73 2e 20 20 50 61 67   100 bytes.  Pag
1310: 65 20 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20  e 1 only..**    
1320: 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    |-------------
1330: 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70  ---|.**      | p
1340: 61 67 65 20 68 65 61 64 65 72 20 20 20 20 7c 20  age header    | 
1350: 20 20 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65    8 bytes for le
1360: 61 76 65 73 2e 20 20 31 32 20 62 79 74 65 73 20  aves.  12 bytes 
1370: 66 6f 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  for interior nod
1380: 65 73 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  es.**      |----
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
13a0: 20 20 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69        | cell poi
13b0: 6e 74 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20  nter   |   |  2 
13c0: 62 79 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20  bytes per cell. 
13d0: 20 53 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a   Sorted order..*
13e0: 2a 20 20 20 20 20 20 7c 20 61 72 72 61 79 20 20  *      | array  
13f0: 20 20 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47          |   |  G
1400: 72 6f 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a  rows downward.**
1410: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1420: 20 20 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20         |   v.** 
1430: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1440: 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20  ------|.**      
1450: 7c 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20  | unallocated   
1460: 20 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61   |.**      | spa
1470: 63 65 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a  ce          |.**
1480: 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d        |---------
1490: 2d 2d 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72  -------|   ^  Gr
14a0: 6f 77 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20  ows upwards.**  
14b0: 20 20 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65      | cell conte
14c0: 6e 74 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69  nt   |   |  Arbi
14d0: 74 72 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65  trary order inte
14e0: 72 73 70 65 72 73 65 64 20 77 69 74 68 20 66 72  rspersed with fr
14f0: 65 65 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20  eeblocks..**    
1500: 20 20 7c 20 61 72 65 61 20 20 20 20 20 20 20 20    | area        
1510: 20 20 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72     |   |  and fr
1520: 65 65 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e  ee space fragmen
1530: 74 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d  ts..**      |---
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a  -------------|.*
1550: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65  *.** The page he
1560: 61 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65  aders looks like
1570: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f   this:.**.**   O
1580: 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20  FFSET   SIZE    
1590: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
15a0: 20 20 20 20 20 30 20 20 20 20 20 20 20 31 20 20       0       1  
15b0: 20 20 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e      Flags. 1: in
15c0: 74 6b 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74  tkey, 2: zerodat
15d0: 61 2c 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20  a, 4: leafdata, 
15e0: 38 3a 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20  8: leaf.**      
15f0: 31 20 20 20 20 20 20 20 32 20 20 20 20 20 20 62  1       2      b
1600: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  yte offset to th
1610: 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
1620: 6b 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  k.**      3     
1630: 20 20 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20    2      number 
1640: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73  of cells on this
1650: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20   page.**      5 
1660: 20 20 20 20 20 20 32 20 20 20 20 20 20 66 69 72        2      fir
1670: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
1680: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1690: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
16a0: 20 31 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f   1      number o
16b0: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65  f fragmented fre
16c0: 65 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20  e bytes.**      
16d0: 38 20 20 20 20 20 20 20 34 20 20 20 20 20 20 52  8       4      R
16e0: 69 67 68 74 20 63 68 69 6c 64 20 28 74 68 65 20  ight child (the 
16f0: 50 74 72 28 4e 29 20 76 61 6c 75 65 29 2e 20 20  Ptr(N) value).  
1700: 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76 65  Omitted on leave
1710: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  s..**.** The fla
1720: 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66 6f  gs define the fo
1730: 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74 72  rmat of this btr
1740: 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c 65  ee page.  The le
1750: 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  af flag means th
1760: 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65 20  at.** this page 
1770: 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2e  has no children.
1780: 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20 66    The zerodata f
1790: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
17a0: 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65 73  his page carries
17b0: 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61 6e  .** only keys an
17c0: 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65 20  d no data.  The 
17d0: 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61 6e  intkey flag mean
17e0: 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69  s that the key i
17f0: 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77  s a integer.** w
1800: 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69  hich is stored i
1810: 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20 65  n the key size e
1820: 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  ntry of the cell
1830: 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20 74   header rather t
1840: 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61  han in.** the pa
1850: 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a 2a  yload area..**.*
1860: 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  * The cell point
1870: 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73 20  er array begins 
1880: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79 74  on the first byt
1890: 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  e after the page
18a0: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65 20   header..** The 
18b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
18c0: 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  ay contains zero
18d0: 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65 20   or more 2-byte 
18e0: 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
18f0: 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72 6f  e.** offsets fro
1900: 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
1910: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  of the page to t
1920: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1930: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 63  in the cell.** c
1940: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
1950: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  e cell pointers 
1960: 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64 20  occur in sorted 
1970: 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73 74  order.  The syst
1980: 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74 6f  em strives.** to
1990: 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63 65   keep free space
19a0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
19b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  cell pointer so 
19c0: 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20 63  that new cells c
19d0: 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79 20  an.** be easily 
19e0: 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68 61  added without ha
19f0: 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d 65  ving to defragme
1a00: 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  nt the page..**.
1a10: 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ** Cell content 
1a20: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
1a30: 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65   very end of the
1a40: 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73 20   page and grows 
1a50: 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62 65  toward the.** be
1a60: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
1a70: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73 65  age..**.** Unuse
1a80: 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74  d space within t
1a90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1aa0: 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74 65  area is collecte
1ab0: 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64 20  d into a linked 
1ac0: 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65 62  list of.** freeb
1ad0: 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72 65  locks.  Each fre
1ae0: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65 61  eblock is at lea
1af0: 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  st 4 bytes in si
1b00: 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f 66  ze.  The byte of
1b10: 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 66  fset.** to the f
1b20: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 69  irst freeblock i
1b30: 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 68  s given in the h
1b40: 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f 63  eader.  Freebloc
1b50: 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20 69  ks occur in.** i
1b60: 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72 2e  ncreasing order.
1b70: 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65 65    Because a free
1b80: 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61 74  block must be at
1b90: 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 69   least 4 bytes i
1ba0: 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20 67  n size,.** any g
1bb0: 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65 77  roup of 3 or few
1bc0: 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  er unused bytes 
1bd0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  in the cell cont
1be0: 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74 0a  ent area cannot.
1bf0: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1c00: 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e 2e  freeblock chain.
1c10: 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20 6f    A group of 3 o
1c20: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79 74  r fewer free byt
1c30: 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  es is called.** 
1c40: 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68 65  a fragment.  The
1c50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c60: 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66 72   bytes in all fr
1c70: 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f 72  agments is recor
1c80: 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ded..** in the p
1c90: 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f 66  age header at of
1ca0: 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20 20  fset 7..**.**   
1cb0: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
1cc0: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20 20  TION.**      2  
1cd0: 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f     Byte offset o
1ce0: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
1cf0: 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20 20  lock.**      2  
1d00: 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69 73     Bytes in this
1d10: 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a   freeblock.**.**
1d20: 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76 61   Cells are of va
1d30: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20 20  riable length.  
1d40: 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65 64  Cells are stored
1d50: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1d60: 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a 20  tent area at.** 
1d70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1d80: 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20 74  age.  Pointers t
1d90: 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  o the cells are 
1da0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  in the cell poin
1db0: 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68 61  ter array.** tha
1dc0: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1dd0: 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20 68  llows the page h
1de0: 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69 73  eader.  Cells is
1df0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e00: 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20 6f  .** contiguous o
1e10: 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74 20  r in order, but 
1e20: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 72  cell pointers ar
1e30: 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e 64  e contiguous and
1e40: 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a   in order..**.**
1e50: 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d 61   Cell content ma
1e60: 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69 61  kes use of varia
1e70: 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
1e80: 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c 65  ers.  A variable
1e90: 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  .** length integ
1ea0: 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79 74  er is 1 to 9 byt
1eb0: 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f 77  es where the low
1ec0: 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61 63  er 7 bits of eac
1ed0: 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20 75  h .** byte are u
1ee0: 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67 65  sed.  The intege
1ef0: 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c  r consists of al
1f00: 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61 76  l bytes that hav
1f10: 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64 0a  e bit 8 set and.
1f20: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
1f30: 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c 65  e with bit 8 cle
1f40: 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73 69  ar.  The most si
1f50: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 6f  gnificant byte o
1f60: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
1f70: 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e 20   appears first. 
1f80: 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67   A variable-leng
1f90: 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20 6e  th integer may n
1fa0: 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ot be more than 
1fb0: 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a  9 bytes long..**
1fc0: 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   As a special ca
1fd0: 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73 20  se, all 8 bytes 
1fe0: 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65 20  of the 9th byte 
1ff0: 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74 61  are used as data
2000: 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f 77  .  This.** allow
2010: 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
2020: 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65 64  er to be encoded
2030: 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a 0a   in 9 bytes..**.
2040: 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20 20  **    0x00      
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
2070: 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20 20  000.**    0x7f  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
20a0: 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30 78  000007f.**    0x
20b0: 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20 20  81 0x00         
20c0: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
20d0: 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20 20   0x00000080.**  
20e0: 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20 20    0x82 0x00     
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2100: 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30 0a  mes  0x00000100.
2110: 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66 20  **    0x80 0x7f 
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
2140: 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20 30  07f.**    0x8a 0
2150: 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30 78  x91 0xd1 0xac 0x
2160: 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78 31  78  becomes  0x1
2170: 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30 78  2345678.**    0x
2180: 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78 38  81 0x81 0x81 0x8
2190: 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73 20  1 0x01  becomes 
21a0: 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a 2a   0x10204081.**.*
21b0: 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  * Variable lengt
21c0: 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 75  h integers are u
21d0: 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20 61  sed for rowids a
21e0: 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  nd to hold the n
21f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
2200: 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61 74  s of key and dat
2210: 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65 6c  a in a btree cel
2220: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  l..**.** The con
2230: 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20 6c  tent of a cell l
2240: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
2250: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
2260: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
2270: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2280: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 65  number of the le
2290: 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74 65  ft child. Omitte
22a0: 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20 69  d if leaf flag i
22b0: 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61  s set..**     va
22c0: 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62  r    Number of b
22d0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f 6d  ytes of data. Om
22e0: 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65 72  itted if the zer
22f0: 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73 65  odata flag is se
2300: 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20 20  t..**     var   
2310: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2320: 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65 20   of key. Or the 
2330: 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69 6e  key itself if in
2340: 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65 74  tkey flag is set
2350: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  ..**      *     
2360: 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  Payload.**      
2370: 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67 65  4     First page
2380: 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   of the overflow
2390: 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65 64   chain.  Omitted
23a0: 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   if no overflow.
23b0: 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20 70  **.** Overflow p
23c0: 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e 6b  ages form a link
23d0: 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20 70  ed list.  Each p
23e0: 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 6c  age except the l
23f0: 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ast is completel
2400: 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68  y.** filled with
2410: 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65 20   data (pagesize 
2420: 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68 65  - 4 bytes).  The
2430: 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20 68   last page can h
2440: 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a 2a  ave as little.**
2450: 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64 61   as 1 byte of da
2460: 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a  ta..**.**    SIZ
2470: 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e  E    DESCRIPTION
2480: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 50  .**      4     P
2490: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  age number of ne
24a0: 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24b0: 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20 44  .**      *     D
24c0: 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c 69  ata.**.** Freeli
24d0: 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69 6e  st pages come in
24e0: 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20 74   two subtypes: t
24f0: 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20 6c  runk pages and l
2500: 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65 0a  eaf pages.  The.
2510: 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20 70  ** file header p
2520: 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20 69  oints to first i
2530: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
2540: 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 20  of trunk page.  
2550: 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70 61  Each trunk.** pa
2560: 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75 6c  ge points to mul
2570: 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65 73  tiple leaf pages
2580: 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  .  The content o
2590: 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  f a leaf page is
25a0: 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64 2e  .** unspecified.
25b0: 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20 6c    A trunk page l
25c0: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
25d0: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
25e0: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
25f0: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2600: 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20 74  number of next t
2610: 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20 20  runk page.**    
2620: 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f    4     Number o
2630: 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73 20  f leaf pointers 
2640: 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2650: 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f 20       *     zero 
2660: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e 75  or more pages nu
2670: 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73 0a  mbers of leaves.
2680: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
2690: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
26a0: 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e  de "pager.h".#in
26b0: 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22 0a  clude "btree.h".
26c0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
26d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
26e0: 2e 68 3e 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75 70  .h>../* Round up
26f0: 20 61 20 6e 75 6d 62 65 72 20 74 6f 20 74 68 65   a number to the
2700: 20 6e 65 78 74 20 6c 61 72 67 65 72 20 6d 75 6c   next larger mul
2710: 74 69 70 6c 65 20 6f 66 20 38 2e 20 20 54 68 69  tiple of 8.  Thi
2720: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
2730: 66 6f 72 63 65 20 38 2d 62 79 74 65 20 61 6c 69  force 8-byte ali
2740: 67 6e 6d 65 6e 74 20 6f 6e 20 36 34 2d 62 69 74  gnment on 64-bit
2750: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a   architectures..
2760: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e 44  */.#define ROUND
2770: 38 28 78 29 20 20 20 28 28 78 2b 37 29 26 7e 37  8(x)   ((x+7)&~7
2780: 29 0a 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ).../* The follo
2790: 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74 68  wing value is th
27a0: 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73  e maximum cell s
27b0: 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20 6d  ize assuming a m
27c0: 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20 73  aximum page.** s
27d0: 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e 0a  ize give above..
27e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 45  */.#define MX_CE
27f0: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28 70  LL_SIZE(pBt)  (p
2800: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29 0a  Bt->pageSize-8).
2810: 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  ./* The maximum 
2820: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2830: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
2840: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2850: 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75 6d  .  This.** assum
2860: 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65 6c  es a minimum cel
2870: 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74 65  l size of 3 byte
2880: 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20 63  s.  Such small c
2890: 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ells will be.** 
28a0: 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72 65  exceedingly rare
28b0: 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20 70  , but they are p
28c0: 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ossible..*/.#def
28d0: 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ine MX_CELL(pBt)
28e0: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
28f0: 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77 61  -8)/3)../* Forwa
2900: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd declarations 
2910: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2920: 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61 67  t MemPage MemPag
2930: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
2940: 74 20 42 74 4c 6f 63 6b 20 42 74 4c 6f 63 6b 3b  t BtLock BtLock;
2950: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2960: 61 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 74  a magic string t
2970: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2980: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2990: 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69 74 65 20  every.** SQLite 
29a0: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
29b0: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  r to identify th
29c0: 65 20 66 69 6c 65 20 61 73 20 61 20 72 65 61 6c  e file as a real
29d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
29e0: 20 59 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20   You can change 
29f0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 63 6f  this value at co
2a00: 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 73 70  mpile-time by sp
2a10: 65 63 69 66 79 69 6e 67 20 61 0a 2a 2a 20 2d 44  ecifying a.** -D
2a20: 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
2a30: 45 52 3d 22 2e 2e 2e 22 20 6f 6e 20 74 68 65 20  ER="..." on the 
2a40: 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64  compiler command
2a50: 2d 6c 69 6e 65 2e 20 20 54 68 65 0a 2a 2a 20 68  -line.  The.** h
2a60: 65 61 64 65 72 20 6d 75 73 74 20 62 65 20 65 78  eader must be ex
2a70: 61 63 74 6c 79 20 31 36 20 62 79 74 65 73 20 69  actly 16 bytes i
2a80: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 7a 65 72  ncluding the zer
2a90: 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 20 73 6f 0a  o-terminator so.
2aa0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 74  ** the string it
2ab0: 73 65 6c 66 20 73 68 6f 75 6c 64 20 62 65 20 31  self should be 1
2ac0: 35 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e  5 characters lon
2ad0: 67 2e 20 20 49 66 20 79 6f 75 20 63 68 61 6e 67  g.  If you chang
2ae0: 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 2c  e.** the header,
2af0: 20 74 68 65 6e 20 79 6f 75 72 20 63 75 73 74 6f   then your custo
2b00: 6d 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20 6e  m library will n
2b10: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65  ot be able to re
2b20: 61 64 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 73  ad .** databases
2b30: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2b40: 65 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c 73  e standard tools
2b50: 20 61 6e 64 20 74 68 65 20 73 74 61 6e 64 61 72   and the standar
2b60: 64 20 74 6f 6f 6c 73 0a 2a 2a 20 77 69 6c 6c 20  d tools.** will 
2b70: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72  not be able to r
2b80: 65 61 64 20 64 61 74 61 62 61 73 65 73 20 63 72  ead databases cr
2b90: 65 61 74 65 64 20 62 79 20 79 6f 75 72 20 63 75  eated by your cu
2ba0: 73 74 6f 6d 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  stom library..*/
2bb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc0: 46 49 4c 45 5f 48 45 41 44 45 52 20 2f 2a 20 31  FILE_HEADER /* 1
2bd0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 20  23456789 123456 
2be0: 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  */.#  define SQL
2bf0: 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 20  ITE_FILE_HEADER 
2c00: 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33  "SQLite format 3
2c10: 22 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ".#endif.static 
2c20: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69  const char zMagi
2c30: 63 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49  cHeader[] = SQLI
2c40: 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a  TE_FILE_HEADER;.
2c50: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 74 79 70 65  ./*.** Page type
2c60: 20 66 6c 61 67 73 2e 20 20 41 6e 20 4f 52 65 64   flags.  An ORed
2c70: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
2c80: 74 68 65 73 65 20 66 6c 61 67 73 20 61 70 70 65  these flags appe
2c90: 61 72 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ar as the.** fir
2ca0: 73 74 20 62 79 74 65 20 6f 66 20 65 76 65 72 79  st byte of every
2cb0: 20 42 54 72 65 65 20 70 61 67 65 2e 0a 2a 2f 0a   BTree page..*/.
2cc0: 23 64 65 66 69 6e 65 20 50 54 46 5f 49 4e 54 4b  #define PTF_INTK
2cd0: 45 59 20 20 20 20 30 78 30 31 0a 23 64 65 66 69  EY    0x01.#defi
2ce0: 6e 65 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  ne PTF_ZERODATA 
2cf0: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 50 54   0x02.#define PT
2d00: 46 5f 4c 45 41 46 44 41 54 41 20 20 30 78 30 34  F_LEAFDATA  0x04
2d10: 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45 41  .#define PTF_LEA
2d20: 46 20 20 20 20 20 20 30 78 30 38 0a 0a 2f 2a 0a  F      0x08../*.
2d30: 2a 2a 20 41 73 20 65 61 63 68 20 70 61 67 65 20  ** As each page 
2d40: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6c  of the file is l
2d50: 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
2d60: 79 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  y, an instance o
2d70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
2d80: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
2d90: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 69 6e 69  appended and ini
2da0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
2db0: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
2dc0: 65 20 73 74 6f 72 65 73 0a 2a 2a 20 69 6e 66 6f  e stores.** info
2dd0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2de0: 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20 64  e page that is d
2df0: 65 63 6f 64 65 64 20 66 72 6f 6d 20 74 68 65 20  ecoded from the 
2e00: 72 61 77 20 66 69 6c 65 20 70 61 67 65 2e 0a 2a  raw file page..*
2e10: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
2e20: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 62 61   field points ba
2e30: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
2e40: 20 70 61 67 65 2e 20 20 54 68 69 73 20 61 6c 6c   page.  This all
2e50: 6f 77 73 20 75 73 20 74 6f 0a 2a 2a 20 77 61 6c  ows us to.** wal
2e60: 6b 20 75 70 20 74 68 65 20 42 54 72 65 65 20 66  k up the BTree f
2e70: 72 6f 6d 20 61 6e 79 20 6c 65 61 66 20 74 6f 20  rom any leaf to 
2e80: 74 68 65 20 72 6f 6f 74 2e 20 20 43 61 72 65 20  the root.  Care 
2e90: 6d 75 73 74 20 62 65 20 74 61 6b 65 6e 20 74 6f  must be taken to
2ea0: 0a 2a 2a 20 75 6e 72 65 66 28 29 20 74 68 65 20  .** unref() the 
2eb0: 70 61 72 65 6e 74 20 70 61 67 65 20 70 6f 69 6e  parent page poin
2ec0: 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 70 61  ter when this pa
2ed0: 67 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ge is no longer 
2ee0: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 54  referenced..** T
2ef0: 68 65 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  he pageDestructo
2f00: 72 28 29 20 72 6f 75 74 69 6e 65 20 68 61 6e 64  r() routine hand
2f10: 6c 65 73 20 74 68 61 74 20 63 68 6f 72 65 2e 0a  les that chore..
2f20: 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 50 61 67  */.struct MemPag
2f30: 65 20 7b 0a 20 20 75 38 20 69 73 49 6e 69 74 3b  e {.  u8 isInit;
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f50: 75 65 20 69 66 20 70 72 65 76 69 6f 75 73 6c 79  ue if previously
2f60: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 4d 55   initialized. MU
2f70: 53 54 20 42 45 20 46 49 52 53 54 21 20 2a 2f 0a  ST BE FIRST! */.
2f80: 20 20 75 38 20 69 64 78 53 68 69 66 74 3b 20 20    u8 idxShift;  
2f90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2fa0: 66 20 43 65 6c 6c 20 69 6e 64 69 63 65 73 20 68  f Cell indices h
2fb0: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2fc0: 20 75 38 20 6e 4f 76 65 72 66 6c 6f 77 3b 20 20   u8 nOverflow;  
2fd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2fe0: 6f 66 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  of overflow cell
2ff0: 20 62 6f 64 69 65 73 20 69 6e 20 61 43 65 6c 6c   bodies in aCell
3000: 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 6e 74 4b 65  [] */.  u8 intKe
3010: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
3020: 54 72 75 65 20 69 66 20 69 6e 74 6b 65 79 20 66  True if intkey f
3030: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 20 20  lag is set */.  
3040: 75 38 20 6c 65 61 66 3b 20 20 20 20 20 20 20 20  u8 leaf;        
3050: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3060: 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65 74  leaf flag is set
3070: 20 2a 2f 0a 20 20 75 38 20 7a 65 72 6f 44 61 74   */.  u8 zeroDat
3080: 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  a;         /* Tr
3090: 75 65 20 69 66 20 74 61 62 6c 65 20 73 74 6f 72  ue if table stor
30a0: 65 73 20 6b 65 79 73 20 6f 6e 6c 79 20 2a 2f 0a  es keys only */.
30b0: 20 20 75 38 20 6c 65 61 66 44 61 74 61 3b 20 20    u8 leafData;  
30c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30d0: 66 20 74 61 62 6c 65 73 20 73 74 6f 72 65 73 20  f tables stores 
30e0: 64 61 74 61 20 6f 6e 20 6c 65 61 76 65 73 20 6f  data on leaves o
30f0: 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 68 61 73 44  nly */.  u8 hasD
3100: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
3110: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70 61   True if this pa
3120: 67 65 20 73 74 6f 72 65 73 20 64 61 74 61 20 2a  ge stores data *
3130: 2f 0a 20 20 75 38 20 68 64 72 4f 66 66 73 65 74  /.  u8 hdrOffset
3140: 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30 20  ;        /* 100 
3150: 66 6f 72 20 70 61 67 65 20 31 2e 20 20 30 20 6f  for page 1.  0 o
3160: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
3170: 20 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 20   childPtrSize;  
3180: 20 20 20 2f 2a 20 30 20 69 66 20 6c 65 61 66 3d     /* 0 if leaf=
3190: 3d 31 2e 20 20 34 20 69 66 20 6c 65 61 66 3d 3d  =1.  4 if leaf==
31a0: 30 20 2a 2f 0a 20 20 75 31 36 20 6d 61 78 4c 6f  0 */.  u16 maxLo
31b0: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  cal;        /* C
31c0: 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 61 78  opy of Btree.max
31d0: 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e 6d  Local or Btree.m
31e0: 61 78 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36 20  axLeaf */.  u16 
31f0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20  minLocal;       
3200: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42 74 72 65   /* Copy of Btre
3210: 65 2e 6d 69 6e 4c 6f 63 61 6c 20 6f 72 20 42 74  e.minLocal or Bt
3220: 72 65 65 2e 6d 69 6e 4c 65 61 66 20 2a 2f 0a 20  ree.minLeaf */. 
3230: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
3240: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
3250: 6e 20 61 44 61 74 61 20 6f 66 20 66 69 72 73 74  n aData of first
3260: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
3270: 0a 20 20 75 31 36 20 69 64 78 50 61 72 65 6e 74  .  u16 idxParent
3280: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ;       /* Index
3290: 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 74 68   in parent of th
32a0: 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 31 36  is node */.  u16
32b0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
32c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
32d0: 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ree bytes on the
32e0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 6e   page */.  u16 n
32f0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
3300: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
3310: 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  ls on this page,
3320: 20 6c 6f 63 61 6c 20 61 6e 64 20 6f 76 66 6c 20   local and ovfl 
3330: 2a 2f 0a 20 20 73 74 72 75 63 74 20 5f 4f 76 66  */.  struct _Ovf
3340: 6c 43 65 6c 6c 20 7b 20 20 20 2f 2a 20 43 65 6c  lCell {   /* Cel
3350: 6c 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  ls that will not
3360: 20 66 69 74 20 6f 6e 20 61 44 61 74 61 5b 5d 20   fit on aData[] 
3370: 2a 2f 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  */.    u8 *pCell
3380: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
3390: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 62 6f  inters to the bo
33a0: 64 79 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c  dy of the overfl
33b0: 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 75  ow cell */.    u
33c0: 31 36 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  16 idx;         
33d0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
33e0: 73 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 69 64  s cell before id
33f0: 78 2d 74 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c 6f  x-th non-overflo
3400: 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61 4f  w cell */.  } aO
3410: 76 66 6c 5b 35 5d 3b 0a 20 20 42 74 53 68 61 72  vfl[5];.  BtShar
3420: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 2f  ed *pBt;       /
3430: 2a 20 50 6f 69 6e 74 65 72 20 62 61 63 6b 20 74  * Pointer back t
3440: 6f 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  o BTree structur
3450: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  e */.  u8 *aData
3460: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
3470: 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74  ointer back to t
3480: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
3490: 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
34a0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 20 20 2f   *pDbPage;     /
34b0: 2a 20 50 61 67 65 72 20 70 61 67 65 20 68 61 6e  * Pager page han
34c0: 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  dle */.  Pgno pg
34d0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
34e0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
34f0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
3500: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
3510: 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65  ;    /* The pare
3520: 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 2e  nt of this page.
3530: 20 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20    NULL for root 
3540: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
3550: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
3560: 20 6f 66 20 61 20 64 69 73 6b 20 70 61 67 65 20   of a disk page 
3570: 68 61 73 20 74 68 65 20 61 75 78 69 6c 69 61 72  has the auxiliar
3580: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 70  y information ap
3590: 70 65 6e 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65  pended.** to the
35a0: 20 65 6e 64 2e 20 20 45 58 54 52 41 5f 53 49 5a   end.  EXTRA_SIZ
35b0: 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  E is the number 
35c0: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
35d0: 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  e needed to hold
35e0: 0a 2a 2a 20 74 68 61 74 20 65 78 74 72 61 20 69  .** that extra i
35f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23  nformation..*/.#
3600: 64 65 66 69 6e 65 20 45 58 54 52 41 5f 53 49 5a  define EXTRA_SIZ
3610: 45 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  E sizeof(MemPage
3620: 29 0a 0a 2f 2a 20 42 74 72 65 65 20 68 61 6e 64  )../* Btree hand
3630: 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20 42 74 72  le */.struct Btr
3640: 65 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ee {.  sqlite3 *
3650: 70 53 71 6c 69 74 65 3b 0a 20 20 42 74 53 68 61  pSqlite;.  BtSha
3660: 72 65 64 20 2a 70 42 74 3b 0a 20 20 75 38 20 69  red *pBt;.  u8 i
3670: 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20 20 20  nTrans;         
3680: 20 20 20 2f 2a 20 54 52 41 4e 53 5f 4e 4f 4e 45     /* TRANS_NONE
3690: 2c 20 54 52 41 4e 53 5f 52 45 41 44 20 6f 72 20  , TRANS_READ or 
36a0: 54 52 41 4e 53 5f 57 52 49 54 45 20 2a 2f 0a 7d  TRANS_WRITE */.}
36b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 42 74 72 65 65 2e 69  ;../*.** Btree.i
36c0: 6e 54 72 61 6e 73 20 6d 61 79 20 74 61 6b 65 20  nTrans may take 
36d0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
36e0: 77 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  wing values..**.
36f0: 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
3700: 2d 64 61 74 61 20 65 78 74 65 6e 73 69 6f 6e 20  -data extension 
3710: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72  is enabled, ther
3720: 65 20 6d 61 79 20 62 65 20 6d 75 6c 74 69 70 6c  e may be multipl
3730: 65 20 75 73 65 72 73 0a 2a 2a 20 6f 66 20 74 68  e users.** of th
3740: 65 20 42 74 72 65 65 20 73 74 72 75 63 74 75 72  e Btree structur
3750: 65 2e 20 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  e. At most one o
3760: 66 20 74 68 65 73 65 20 6d 61 79 20 6f 70 65 6e  f these may open
3770: 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
3780: 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 61 6e 79  tion,.** but any
3790: 20 6e 75 6d 62 65 72 20 6d 61 79 20 68 61 76 65   number may have
37a0: 20 61 63 74 69 76 65 20 72 65 61 64 20 74 72 61   active read tra
37b0: 6e 73 61 63 74 69 6f 6e 73 2e 20 56 61 72 69 61  nsactions. Varia
37c0: 62 6c 65 20 42 74 72 65 65 2e 70 44 62 20 0a 2a  ble Btree.pDb .*
37d0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
37e0: 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
37f0: 20 61 6e 79 20 63 75 72 72 65 6e 74 20 77 72 69   any current wri
3800: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
3810: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53  */.#define TRANS
3820: 5f 4e 4f 4e 45 20 20 30 0a 23 64 65 66 69 6e 65  _NONE  0.#define
3830: 20 54 52 41 4e 53 5f 52 45 41 44 20 20 31 0a 23   TRANS_READ  1.#
3840: 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 57 52 49  define TRANS_WRI
3850: 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 45 76 65 72  TE 2../*.** Ever
3860: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 20 74  ything we need t
3870: 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 20 61 6e 20  o know about an 
3880: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2f  open database.*/
3890: 0a 73 74 72 75 63 74 20 42 74 53 68 61 72 65 64  .struct BtShared
38a0: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
38b0: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er;        /* Th
38c0: 65 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0a  e page cache */.
38d0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
38e0: 73 6f 72 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73  sor;    /* A lis
38f0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 63 75  t of all open cu
3900: 72 73 6f 72 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  rsors */.  MemPa
3910: 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
3920: 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
3930: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
3940: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
3950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3960: 65 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 61  e if we are in a
3970: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
3980: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
3990: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
39a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
39b0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  the underlying f
39c0: 69 6c 65 20 69 73 20 72 65 61 64 6f 6e 6c 79 20  ile is readonly 
39d0: 2a 2f 0a 20 20 75 38 20 6d 61 78 45 6d 62 65 64  */.  u8 maxEmbed
39e0: 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20 4d 61  Frac;      /* Ma
39f0: 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20 61 73  ximum payload as
3a00: 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61 67 65   % of total page
3a10: 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6d 69   size */.  u8 mi
3a20: 6e 45 6d 62 65 64 46 72 61 63 3b 20 20 20 20 20  nEmbedFrac;     
3a30: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 70 61 79 6c   /* Minimum payl
3a40: 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f 74 61  oad as % of tota
3a50: 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  l page size */. 
3a60: 20 75 38 20 6d 69 6e 4c 65 61 66 46 72 61 63 3b   u8 minLeafFrac;
3a70: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
3a80: 6d 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 61  m leaf payload a
3a90: 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61 67  s % of total pag
3aa0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20 70  e size */.  u8 p
3ab0: 61 67 65 53 69 7a 65 46 69 78 65 64 3b 20 20 20  ageSizeFixed;   
3ac0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3ad0: 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e 20 6e   page size can n
3ae0: 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
3af0: 67 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ged */.#ifndef S
3b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
3b10: 41 43 55 55 4d 0a 20 20 75 38 20 61 75 74 6f 56  ACUUM.  u8 autoV
3b20: 61 63 75 75 6d 3b 20 20 20 20 20 20 20 20 2f 2a  acuum;        /*
3b30: 20 54 72 75 65 20 69 66 20 61 75 74 6f 2d 76 61   True if auto-va
3b40: 63 75 75 6d 20 69 73 20 65 6e 61 62 6c 65 64 20  cuum is enabled 
3b50: 2a 2f 0a 20 20 75 38 20 69 6e 63 72 56 61 63 75  */.  u8 incrVacu
3b60: 75 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  um;        /* Tr
3b70: 75 65 20 69 66 20 69 6e 63 72 2d 76 61 63 75 75  ue if incr-vacuu
3b80: 6d 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  m is enabled */.
3b90: 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 3b 20 20    Pgno nTrunc;  
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
3bb0: 65 72 6f 20 69 66 20 74 68 65 20 64 62 20 77 69  ero if the db wi
3bc0: 6c 6c 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ll be truncated 
3bd0: 28 69 6e 63 72 20 76 61 63 75 75 6d 29 20 2a 2f  (incr vacuum) */
3be0: 0a 23 65 6e 64 69 66 0a 20 20 75 31 36 20 70 61  .#endif.  u16 pa
3bf0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
3c00: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3c10: 6f 66 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  of bytes on a pa
3c20: 67 65 20 2a 2f 0a 20 20 75 31 36 20 75 73 61 62  ge */.  u16 usab
3c30: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  leSize;       /*
3c40: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
3c50: 65 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20  e bytes on each 
3c60: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  page */.  int ma
3c70: 78 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 20  xLocal;         
3c80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61 6c  /* Maximum local
3c90: 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d   payload in non-
3ca0: 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73 20  LEAFDATA tables 
3cb0: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  */.  int minLoca
3cc0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69  l;         /* Mi
3cd0: 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  nimum local payl
3ce0: 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44  oad in non-LEAFD
3cf0: 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ATA tables */.  
3d00: 69 6e 74 20 6d 61 78 4c 65 61 66 3b 20 20 20 20  int maxLeaf;    
3d10: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
3d20: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3d30: 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 61 62  n a LEAFDATA tab
3d40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  le */.  int minL
3d50: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf;          /*
3d60: 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20 70   Minimum local p
3d70: 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41 46  ayload in a LEAF
3d80: 44 41 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20  DATA table */.  
3d90: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
3da0: 73 79 48 61 6e 64 6c 65 72 3b 20 20 20 2f 2a 20  syHandler;   /* 
3db0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 77 68 65  Callback for whe
3dc0: 6e 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20  n there is lock 
3dd0: 63 6f 6e 74 65 6e 74 69 6f 6e 20 2a 2f 0a 20 20  contention */.  
3de0: 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
3df0: 3b 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 61 63  ;     /* Transac
3e00: 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 20 20  tion state */.  
3e10: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
3e20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3e30: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
3e40: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3e50: 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61  */.  int nTransa
3e60: 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  ction;     /* Nu
3e70: 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 74 72 61  mber of open tra
3e80: 6e 73 61 63 74 69 6f 6e 73 20 28 72 65 61 64 20  nsactions (read 
3e90: 2b 20 77 72 69 74 65 29 20 2a 2f 0a 20 20 76 6f  + write) */.  vo
3ea0: 69 64 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20  id *pSchema;    
3eb0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3ec0: 6f 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  o space allocate
3ed0: 64 20 62 79 20 73 71 6c 69 74 65 33 42 74 72 65  d by sqlite3Btre
3ee0: 65 53 63 68 65 6d 61 28 29 20 2a 2f 0a 20 20 76  eSchema() */.  v
3ef0: 6f 69 64 20 28 2a 78 46 72 65 65 53 63 68 65 6d  oid (*xFreeSchem
3f00: 61 29 28 76 6f 69 64 2a 29 3b 20 20 2f 2a 20 44  a)(void*);  /* D
3f10: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 42 74  estructor for Bt
3f20: 53 68 61 72 65 64 2e 70 53 63 68 65 6d 61 20 2a  Shared.pSchema *
3f30: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
3f40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3f50: 48 45 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  HE.  BtLock *pLo
3f60: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ck;        /* Li
3f70: 73 74 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  st of locks held
3f80: 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
3f90: 62 74 72 65 65 20 73 74 72 75 63 74 20 2a 2f 0a  btree struct */.
3fa0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4e 65 78    BtShared *pNex
3fb0: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
3fc0: 69 6e 20 54 68 72 65 61 64 44 61 74 61 2e 70 42  in ThreadData.pB
3fd0: 74 72 65 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74  tree linked list
3fe0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
3ff0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4000: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4010: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
4020: 73 65 64 20 74 6f 20 68 6f 6c 64 20 69 6e 66 6f  sed to hold info
4030: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74  rmation.** about
4040: 20 61 20 63 65 6c 6c 2e 20 20 54 68 65 20 70 61   a cell.  The pa
4050: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 66 75 6e  rseCellPtr() fun
4060: 63 74 69 6f 6e 20 66 69 6c 6c 73 20 69 6e 20 74  ction fills in t
4070: 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  his structure.**
4080: 20 62 61 73 65 64 20 6f 6e 20 69 6e 66 6f 72 6d   based on inform
4090: 61 74 69 6f 6e 20 65 78 74 72 61 63 74 20 66 72  ation extract fr
40a0: 6f 6d 20 74 68 65 20 72 61 77 20 64 69 73 6b 20  om the raw disk 
40b0: 70 61 67 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  page..*/.typedef
40c0: 20 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f   struct CellInfo
40d0: 20 43 65 6c 6c 49 6e 66 6f 3b 0a 73 74 72 75 63   CellInfo;.struc
40e0: 74 20 43 65 6c 6c 49 6e 66 6f 20 7b 0a 20 20 75  t CellInfo {.  u
40f0: 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 2f 2a  8 *pCell;     /*
4100: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
4110: 73 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f  start of cell co
4120: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e  ntent */.  i64 n
4130: 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Key;      /* The
4140: 20 6b 65 79 20 66 6f 72 20 49 4e 54 4b 45 59 20   key for INTKEY 
4150: 74 61 62 6c 65 73 2c 20 6f 72 20 6e 75 6d 62 65  tables, or numbe
4160: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6b 65  r of bytes in ke
4170: 79 20 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74 61  y */.  u32 nData
4180: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
4190: 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
41a0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
41b0: 61 64 3b 20 20 2f 2a 20 54 6f 74 61 6c 20 61 6d  ad;  /* Total am
41c0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
41d0: 2a 2f 0a 20 20 75 31 36 20 6e 48 65 61 64 65 72  */.  u16 nHeader
41e0: 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  ;   /* Size of t
41f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
4200: 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
4210: 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 63 61 6c 3b  */.  u16 nLocal;
4220: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
4230: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
4240: 63 61 6c 6c 79 20 2a 2f 0a 20 20 75 31 36 20 69  cally */.  u16 i
4250: 4f 76 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66  Overflow; /* Off
4260: 73 65 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  set to overflow 
4270: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a 65  page number.  Ze
4280: 72 6f 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f  ro if no overflo
4290: 77 20 2a 2f 0a 20 20 75 31 36 20 6e 53 69 7a 65  w */.  u16 nSize
42a0: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
42b0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
42c0: 74 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  t on the main b-
42d0: 74 72 65 65 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a  tree page */.};.
42e0: 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  ./*.** A cursor 
42f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4300: 61 20 70 61 72 74 69 63 75 6c 61 72 20 65 6e 74  a particular ent
4310: 72 79 20 69 6e 20 74 68 65 20 42 54 72 65 65 2e  ry in the BTree.
4320: 0a 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 69 73  .** The entry is
4330: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69   identified by i
4340: 74 73 20 4d 65 6d 50 61 67 65 20 61 6e 64 20 74  ts MemPage and t
4350: 68 65 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d  he index in.** M
4360: 65 6d 50 61 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f  emPage.aCell[] o
4370: 66 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  f the entry..*/.
4380: 73 74 72 75 63 74 20 42 74 43 75 72 73 6f 72 20  struct BtCursor 
4390: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
43a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
43b0: 20 54 68 65 20 42 74 72 65 65 20 74 6f 20 77 68   The Btree to wh
43c0: 69 63 68 20 74 68 69 73 20 63 75 72 73 6f 72 20  ich this cursor 
43d0: 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 42 74 43  belongs */.  BtC
43e0: 75 72 73 6f 72 20 2a 70 4e 65 78 74 2c 20 2a 70  ursor *pNext, *p
43f0: 50 72 65 76 3b 20 20 2f 2a 20 46 6f 72 6d 73 20  Prev;  /* Forms 
4400: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
4410: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
4420: 20 20 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72 65    int (*xCompare
4430: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
4440: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
4450: 74 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 4b 65 79  t void*); /* Key
4460: 20 63 6f 6d 70 20 66 75 6e 63 20 2a 2f 0a 20 20   comp func */.  
4470: 76 6f 69 64 20 2a 70 41 72 67 3b 20 20 20 20 20  void *pArg;     
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4490: 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
44a0: 72 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  re() */.  Pgno p
44b0: 67 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20 20  gnoRoot;        
44c0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
44d0: 70 61 67 65 20 6f 66 20 74 68 69 73 20 74 72 65  page of this tre
44e0: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
44f0: 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
4500: 20 2f 2a 20 50 61 67 65 20 74 68 61 74 20 63 6f   /* Page that co
4510: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
4520: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
4550: 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
4560: 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c  aCell[] */.  Cel
4570: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20 20  lInfo info;     
4580: 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 73         /* A pars
4590: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 65  e of the cell we
45a0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
45b0: 20 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67 3b   */.  u8 wrFlag;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 69 74 61  /* True if writa
45e0: 62 6c 65 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ble */.  u8 eSta
45f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
4600: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
4610: 20 43 55 52 53 4f 52 5f 58 58 58 20 63 6f 6e 73   CURSOR_XXX cons
4620: 74 61 6e 74 73 20 28 73 65 65 20 62 65 6c 6f 77  tants (see below
4630: 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4b 65  ) */.  void *pKe
4640: 79 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  y;      /* Saved
4650: 20 6b 65 79 20 74 68 61 74 20 77 61 73 20 63 75   key that was cu
4660: 72 73 6f 72 27 73 20 6c 61 73 74 20 6b 6e 6f 77  rsor's last know
4670: 6e 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20  n position */.  
4680: 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  i64 nKey;       
4690: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79   /* Size of pKey
46a0: 2c 20 6f 72 20 6c 61 73 74 20 69 6e 74 65 67 65  , or last intege
46b0: 72 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 73  r key */.  int s
46c0: 6b 69 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 28  kip;        /* (
46d0: 73 6b 69 70 3c 30 29 20 2d 3e 20 50 72 65 76 28  skip<0) -> Prev(
46e0: 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 28 73  ) is a no-op. (s
46f0: 6b 69 70 3e 30 29 20 2d 3e 20 4e 65 78 74 28 29  kip>0) -> Next()
4700: 20 69 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   is */.};../*.**
4710: 20 50 6f 74 65 6e 74 69 61 6c 20 76 61 6c 75 65   Potential value
4720: 73 20 66 6f 72 20 42 74 43 75 72 73 6f 72 2e 65  s for BtCursor.e
4730: 53 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 43 55 52  State..**.** CUR
4740: 53 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a 20 20 20  SOR_VALID:.**   
4750: 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  Cursor points to
4760: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20   a valid entry. 
4770: 67 65 74 50 61 79 6c 6f 61 64 28 29 20 65 74 63  getPayload() etc
4780: 2e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 2e  . may be called.
4790: 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  .**.** CURSOR_IN
47a0: 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73  VALID:.**   Curs
47b0: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e  or does not poin
47c0: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
47d0: 72 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  ry. This can hap
47e0: 70 65 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  pen (for example
47f0: 29 20 0a 2a 2a 20 20 20 62 65 63 61 75 73 65 20  ) .**   because 
4800: 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
4810: 74 79 20 6f 72 20 62 65 63 61 75 73 65 20 42 74  ty or because Bt
4820: 72 65 65 43 75 72 73 6f 72 46 69 72 73 74 28 29  reeCursorFirst()
4830: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a   has not been.**
4840: 20 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a     called..**.**
4850: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4860: 45 45 4b 3a 0a 2a 2a 20 20 20 54 68 65 20 74 61  EEK:.**   The ta
4870: 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 63 75  ble that this cu
4880: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
4890: 6f 6e 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2c  on still exists,
48a0: 20 62 75 74 20 68 61 73 20 62 65 65 6e 20 0a 2a   but has been .*
48b0: 2a 20 20 20 6d 6f 64 69 66 69 65 64 20 73 69 6e  *   modified sin
48c0: 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ce the cursor wa
48d0: 73 20 6c 61 73 74 20 75 73 65 64 2e 20 54 68 65  s last used. The
48e0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
48f0: 20 69 73 20 73 61 76 65 64 0a 2a 2a 20 20 20 69   is saved.**   i
4900: 6e 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  n variables BtCu
4910: 72 73 6f 72 2e 70 4b 65 79 20 61 6e 64 20 42 74  rsor.pKey and Bt
4920: 43 75 72 73 6f 72 2e 6e 4b 65 79 2e 20 57 68 65  Cursor.nKey. Whe
4930: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 69 6e  n a cursor is in
4940: 20 0a 2a 2a 20 20 20 74 68 69 73 20 73 74 61 74   .**   this stat
4950: 65 2c 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  e, restoreOrClea
4960: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
4970: 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  ) can be called 
4980: 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  to attempt to.**
4990: 20 20 20 73 65 65 6b 20 74 68 65 20 63 75 72 73     seek the curs
49a0: 6f 72 20 74 6f 20 74 68 65 20 73 61 76 65 64 20  or to the saved 
49b0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65  position..*/.#de
49c0: 66 69 6e 65 20 43 55 52 53 4f 52 5f 49 4e 56 41  fine CURSOR_INVA
49d0: 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 30 0a  LID           0.
49e0: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 56  #define CURSOR_V
49f0: 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 20  ALID            
4a00: 20 31 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f   1.#define CURSO
4a10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 20 20  R_REQUIRESEEK   
4a20: 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      2../*.** The
4a30: 20 54 52 41 43 45 20 6d 61 63 72 6f 20 77 69 6c   TRACE macro wil
4a40: 6c 20 70 72 69 6e 74 20 68 69 67 68 2d 6c 65 76  l print high-lev
4a50: 65 6c 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  el status inform
4a60: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a  ation about the.
4a70: 2a 2a 20 62 74 72 65 65 20 6f 70 65 72 61 74 69  ** btree operati
4a80: 6f 6e 20 77 68 65 6e 20 74 68 65 20 67 6c 6f 62  on when the glob
4a90: 61 6c 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69  al variable sqli
4aa0: 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20  te3_btree_trace 
4ab0: 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 2e 0a 2a  is.** enabled..*
4ac0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  /.#if SQLITE_TES
4ad0: 54 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45  T.# define TRACE
4ae0: 28 58 29 20 20 20 69 66 28 20 73 71 6c 69 74 65  (X)   if( sqlite
4af0: 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20 29 5c  3_btree_trace )\
4b00: 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  ./*             
4b10: 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c             { sql
4b20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
4b30: 58 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  X; fflush(stdout
4b40: 29 3b 20 7d 20 2a 2f 20 5c 0a 7b 20 70 72 69 6e  ); } */ \.{ prin
4b50: 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64  tf X; fflush(std
4b60: 6f 75 74 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  out); }.int sqli
4b70: 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 3d  te3_btree_trace=
4b80: 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65  0;  /* True to e
4b90: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f  nable tracing */
4ba0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4bb0: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
4bc0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
4bd0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
4be0: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
4bf0: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 50  adLocks(Btree*,P
4c00: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
4c10: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77  ./*.** Read or w
4c20: 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e 64 20  rite a two- and 
4c30: 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d 65 6e  four-byte big-en
4c40: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  dian integer val
4c50: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ues..*/.static u
4c60: 33 32 20 67 65 74 32 62 79 74 65 28 75 6e 73 69  32 get2byte(unsi
4c70: 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a 20  gned char *p){. 
4c80: 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 38   return (p[0]<<8
4c90: 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74  ) | p[1];.}.stat
4ca0: 69 63 20 75 33 32 20 67 65 74 34 62 79 74 65 28  ic u32 get4byte(
4cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4cc0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30  ){.  return (p[0
4cd0: 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c  ]<<24) | (p[1]<<
4ce0: 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20  16) | (p[2]<<8) 
4cf0: 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69 63  | p[3];.}.static
4d00: 20 76 6f 69 64 20 70 75 74 32 62 79 74 65 28 75   void put2byte(u
4d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
4d20: 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20   u32 v){.  p[0] 
4d30: 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20 3d  = v>>8;.  p[1] =
4d40: 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   v;.}.static voi
4d50: 64 20 70 75 74 34 62 79 74 65 28 75 6e 73 69 67  d put4byte(unsig
4d60: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
4d70: 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e   v){.  p[0] = v>
4d80: 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e  >24;.  p[1] = v>
4d90: 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e  >16;.  p[2] = v>
4da0: 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a  >8;.  p[3] = v;.
4db0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
4dc0: 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72  s to read and wr
4dd0: 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  ite variable-len
4de0: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20 54  gth integers.  T
4df0: 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20  hese used to.** 
4e00: 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63 61 6c  be defined local
4e10: 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65 20 75  ly, but now we u
4e20: 73 65 20 74 68 65 20 76 61 72 69 6e 74 20 72 6f  se the varint ro
4e30: 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 75 74  utines in the ut
4e40: 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f  il.c.** file..*/
4e50: 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69  .#define getVari
4e60: 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47 65 74  nt    sqlite3Get
4e70: 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65 66 69 6e  Varint./* #defin
4e80: 65 20 67 65 74 56 61 72 69 6e 74 33 32 20 20 73  e getVarint32  s
4e90: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
4ea0: 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  2 */.#define get
4eb0: 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20 20 28  Varint32(A,B)  (
4ec0: 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78 37 66 3f  (*B=*(A))<=0x7f?
4ed0: 31 3a 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  1:sqlite3GetVari
4ee0: 6e 74 33 32 28 41 2c 42 29 29 0a 23 64 65 66 69  nt32(A,B)).#defi
4ef0: 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20 20 20  ne putVarint    
4f00: 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
4f10: 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ../* The databas
4f20: 65 20 70 61 67 65 20 74 68 65 20 50 45 4e 44 49  e page the PENDI
4f30: 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69 65 73  NG_BYTE occupies
4f40: 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e  . This page is n
4f50: 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20 54 4f  ever used..** TO
4f60: 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  DO: This macro i
4f70: 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 79 20  s very similary 
4f80: 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  to PAGER_MJ_PGNO
4f90: 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e 20 54  () in pager.c. T
4fa0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 70 6f  hey.** should po
4fb0: 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73 6f 6c  ssibly be consol
4fc0: 69 64 61 74 65 64 20 28 70 72 65 73 75 6d 61 62  idated (presumab
4fd0: 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29 2e 0a  ly in pager.h)..
4fe0: 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b 20 49 2f  **.** If disk I/
4ff0: 4f 20 69 73 20 6f 6d 69 74 74 65 64 20 28 6d 65  O is omitted (me
5000: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20 64  aning that the d
5010: 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
5020: 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69 6e 20 6d  d purely.** in m
5030: 65 6d 6f 72 79 29 20 74 68 65 6e 20 74 68 65 72  emory) then ther
5040: 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e 67 20  e is no pending 
5050: 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  byte..*/.#ifdef 
5060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
5070: 49 4f 0a 23 20 64 65 66 69 6e 65 20 50 45 4e 44  IO.# define PEND
5080: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
5090: 74 29 20 20 30 78 37 66 66 66 66 66 66 66 0a 23  t)  0x7fffffff.#
50a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 45  else.# define PE
50b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
50c0: 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  pBt) ((PENDING_B
50d0: 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67 65 53  YTE/(pBt)->pageS
50e0: 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69 66 0a 0a  ize)+1).#endif..
50f0: 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64 20 6c  /*.** A linked l
5100: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
5110: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73 20  wing structures 
5120: 69 73 20 73 74 6f 72 65 64 20 61 74 20 42 74 53  is stored at BtS
5130: 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a 2a 20  hared.pLock..** 
5140: 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65 64 20  Locks are added 
5150: 28 6f 72 20 75 70 67 72 61 64 65 64 20 66 72 6f  (or upgraded fro
5160: 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f 20 57  m READ_LOCK to W
5170: 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65 6e 20  RITE_LOCK) when 
5180: 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73 20  a cursor .** is 
5190: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 74 61  opened on the ta
51a0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ble with root pa
51b0: 67 65 20 42 74 53 68 61 72 65 64 2e 69 54 61 62  ge BtShared.iTab
51c0: 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20 72 65  le. Locks are re
51d0: 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  moved.** from th
51e0: 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61 20 74  is list when a t
51f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
5200: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5210: 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65 6e 0a  d back, or when.
5220: 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e 64 6c  ** a btree handl
5230: 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  e is closed..*/.
5240: 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20 7b 0a  struct BtLock {.
5250: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
5260: 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
5270: 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e 67 20   handle holding 
5280: 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50  this lock */.  P
5290: 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20 20 20  gno iTable;     
52a0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
52b0: 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20  e of table */.  
52c0: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
52d0: 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c 4f        /* READ_LO
52e0: 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b  CK or WRITE_LOCK
52f0: 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4e   */.  BtLock *pN
5300: 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ext;        /* N
5310: 65 78 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e  ext in BtShared.
5320: 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 7d 3b  pLock list */.};
5330: 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 76  ../* Candidate v
5340: 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f 63 6b  alues for BtLock
5350: 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e  .eLock */.#defin
5360: 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20 20 20  e READ_LOCK     
5370: 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f  1.#define WRITE_
5380: 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66 64 65  LOCK    2..#ifde
5390: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
53a0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
53b0: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
53c0: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
53d0: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
53e0: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
53f0: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
5400: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
5410: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
5420: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
5430: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
5440: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
5450: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
5460: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
5470: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
5480: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
5490: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
54a0: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
54b0: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
54c0: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
54d0: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
54e0: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
54f0: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
5500: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
5510: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
5520: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
5530: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
5540: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
5550: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
5560: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
5570: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
5580: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
5590: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
55a0: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
55b0: 54 61 62 6c 65 73 28 61 29 0a 23 65 6c 73 65 0a  Tables(a).#else.
55c0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
55d0: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
55e0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
55f0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
5600: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
5610: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
5620: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
5630: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5640: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
5650: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
5660: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
5670: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
5680: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
5690: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
56a0: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
56b0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
56c0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
56d0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
56e0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
56f0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
5700: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
5710: 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69  er;..  /* This i
5720: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
5730: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
5740: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
5750: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
5760: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
5770: 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44  ly()->useSharedD
5780: 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ata ){.    retur
5790: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
57a0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f  ..  /* This (alo
57b0: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c  ng with lockTabl
57c0: 65 28 29 29 20 69 73 20 77 68 65 72 65 20 74 68  e()) is where th
57d0: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
57e0: 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64  d flag is.  ** d
57f0: 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68  ealt with. If th
5800: 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72  e caller is quer
5810: 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d  ying for a read-
5820: 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61  lock and the fla
5830: 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69  g is.  ** set, i
5840: 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  t is uncondition
5850: 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65  ally granted - e
5860: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
5870: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a   write-locks.  *
5880: 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  * on the table. 
5890: 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  If a write-lock 
58a0: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
58b0: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
58c0: 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e  d flag.  ** is n
58d0: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20  ot considered.. 
58e0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63   **.  ** In func
58f0: 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29  tion lockTable()
5900: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
5910: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
5920: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
5930: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
5940: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
5950: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
5960: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
5970: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
5980: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
5990: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
59a0: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
59b0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
59c0: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
59d0: 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72  s do.  ** not cr
59e0: 65 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20  eate or respect 
59f0: 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65  table locks. The
5a00: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75   locking procedu
5a10: 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77  re for a .  ** w
5a20: 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73  rite-cursor does
5a30: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a   not change..  *
5a40: 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 21 70 2d  /.  if( .    !p-
5a50: 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a 20 20 20  >pSqlite || .   
5a60: 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69 74 65 2d   0==(p->pSqlite-
5a70: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
5a80: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
5a90: 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52  | .    eLock==WR
5aa0: 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20  ITE_LOCK ||.    
5ab0: 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f  iTab==MASTER_ROO
5ac0: 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  T.  ){.    for(p
5ad0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
5ae0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
5af0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
5b00: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
5b10: 74 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72  tree!=p && pIter
5b20: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26  ->iTable==iTab &
5b30: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
5b40: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
5b50: 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44  k || eLock!=READ
5b60: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
5b70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5b80: 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
5b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5ba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5bb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63  ./*.** Add a loc
5bc0: 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77  k on the table w
5bd0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
5be0: 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72  able to the shar
5bf0: 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a  ed-btree used.**
5c00: 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65   by Btree handle
5c10: 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c   p. Parameter eL
5c20: 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68  ock must be eith
5c30: 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  er READ_LOCK or 
5c40: 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a  .** WRITE_LOCK..
5c50: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
5c60: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
5c70: 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64  he lock is added
5c80: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
5c90: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a  QLITE_BUSY and.*
5ca0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d  * SQLITE_NOMEM m
5cb0: 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72  ay also be retur
5cc0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
5cd0: 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72  nt lockTable(Btr
5ce0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
5cf0: 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  le, u8 eLock){. 
5d00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
5d10: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
5d20: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  k *pLock = 0;.  
5d30: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
5d40: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
5d50: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
5d60: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
5d70: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
5d80: 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61   0==sqlite3Threa
5d90: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
5da0: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
5db0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5dc0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
5dd0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b  ssert( SQLITE_OK
5de0: 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  ==queryTableLock
5df0: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
5e00: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
5e10: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
5e20: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
5e30: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
5e40: 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a 20 20  is requested,.  
5e50: 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20  ** return early 
5e60: 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61  without adding a
5e70: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42  n entry to the B
5e80: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
5e90: 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d  st. See.  ** com
5ea0: 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ment in function
5eb0: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
5ec0: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20  ) for more info 
5ed0: 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a  on handling .  *
5ee0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
5ef0: 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f  itted flag..  */
5f00: 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e  .  if( .    (p->
5f10: 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20 20 20  pSqlite) && .   
5f20: 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c   (p->pSqlite->fl
5f30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
5f40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a  ncommitted) && .
5f50: 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44      (eLock==READ
5f60: 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54  _LOCK) &&.    iT
5f70: 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f  able!=MASTER_ROO
5f80: 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T.  ){.    retur
5f90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5fa0: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61  ..  /* First sea
5fb0: 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72  rch the list for
5fc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63   an existing loc
5fd0: 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  k on this table.
5fe0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   */.  for(pIter=
5ff0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
6000: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
6010: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6020: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
6030: 54 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e  Table && pIter->
6040: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
6050: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72     pLock = pIter
6060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6070: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
6080: 66 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72  f the above sear
6090: 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  ch did not find 
60a0: 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20  a BtLock struct 
60b0: 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65  associating Btre
60c0: 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61  e p.  ** with ta
60d0: 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f  ble iTable, allo
60e0: 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e  cate one and lin
60f0: 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  k it into the li
6100: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  st..  */.  if( !
6110: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
6120: 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73  ck = (BtLock *)s
6130: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
6140: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
6150: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
6160: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6170: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6180: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
6190: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
61a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
61b0: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
61c0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
61d0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
61e0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
61f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
6200: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
6210: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
6220: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
6230: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
6240: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
6250: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
6260: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
6270: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
6280: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
6290: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
62a0: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
62b0: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
62c0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
62d0: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
62e0: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
62f0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
6300: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
6310: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
6320: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
6330: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6340: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
6350: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
6360: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
6370: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74  d via calls to t
6380: 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a  he lockTable().*
6390: 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  * procedure) hel
63a0: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
63b0: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
63c0: 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  oid unlockAllTab
63d0: 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  les(Btree *p){. 
63e0: 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72   BtLock **ppIter
63f0: 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c 6f 63   = &p->pBt->pLoc
6400: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  k;..  /* If the 
6410: 73 68 61 72 65 64 2d 63 61 63 68 65 20 65 78 74  shared-cache ext
6420: 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74 20 65 6e  ension is not en
6430: 61 62 6c 65 64 2c 20 74 68 65 72 65 20 73 68 6f  abled, there sho
6440: 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a 2a 20 6c  uld be no.  ** l
6450: 6f 63 6b 73 20 69 6e 20 74 68 65 20 42 74 53 68  ocks in the BtSh
6460: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2c  ared.pLock list,
6470: 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 70 72 6f   making this pro
6480: 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f 70 2e 20  cedure a no-op. 
6490: 41 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74  Assert.  ** that
64a0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
64b0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
64c0: 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ( sqlite3ThreadD
64d0: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75  ataReadOnly()->u
64e0: 73 65 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20  seSharedData || 
64f0: 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20  0==*ppIter );.. 
6500: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
6510: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
6520: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
6530: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
6540: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
6550: 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63    *ppIter = pLoc
6560: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
6570: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b  sqliteFree(pLock
6580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6590: 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c      ppIter = &pL
65a0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
65b0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
65c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
65d0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
65e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
65f0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
6600: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
6610: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
6620: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
6630: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
6640: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
6650: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
6660: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
6670: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
6680: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
6690: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
66a0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
66b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
66c0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
66d0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
66e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
66f0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
6700: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
6710: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
6720: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
6730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6740: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
6750: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
6760: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6770: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
6780: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
6790: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
67a0: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
67b0: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
67c0: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
67d0: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
67e0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
67f0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
6800: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
6810: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
6820: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
6830: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
6840: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
6850: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
6860: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
6870: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
6880: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
6890: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
68a0: 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70 50  K && 0==pCur->pP
68b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20  age->intKey){.  
68c0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
68d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 43 75 72  qliteMalloc(pCur
68e0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  ->nKey);.    if(
68f0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72   pKey ){.      r
6900: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6910: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75  Key(pCur, 0, pCu
6920: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
6930: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6950: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6960: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
6970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6980: 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  eFree(pKey);.   
6990: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
69a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
69b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
69c0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
69d0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
69e0: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
69f0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
6a00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6a10: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
6a20: 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
6a30: 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20  ur->pPage = 0;. 
6a40: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6a50: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
6a60: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  SEEK;.  }..  ret
6a70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6a80: 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
6a90: 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f  ons of all curso
6aa0: 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65 70  rs except pExcep
6ab0: 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61  t open on the ta
6ac0: 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f  ble .** with roo
6ad0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73  t-page iRoot. Us
6ae0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63  ually, this is c
6af0: 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72  alled just befor
6b00: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63  e cursor.** pExc
6b10: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
6b20: 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20  odify the table 
6b30: 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f  (BtreeDelete() o
6b40: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29  r BtreeInsert())
6b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b60: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
6b70: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6b80: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
6b90: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
6ba0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
6bb0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
6bc0: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
6bd0: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
6be0: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
6bf0: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
6c00: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
6c10: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
6c20: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
6c30: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
6c40: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6c50: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
6c60: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6c70: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6c80: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
6c90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6ca0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6cb0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
6cc0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
6cd0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
6ce0: 20 76 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f   void clearCurso
6cf0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6d00: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 73 71 6c  or *pCur){.  sql
6d10: 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  iteFree(pCur->pK
6d20: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
6d30: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
6d40: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
6d50: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
6d60: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
6d70: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
6d80: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
6d90: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
6da0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
6db0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
6dc0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
6dd0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
6de0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
6df0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
6e00: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
6e10: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
6e20: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
6e30: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
6e40: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
6e50: 74 69 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c  tive restoreOrCl
6e60: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
6e70: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6e80: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6e90: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a  orPosition()..**
6ea0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
6eb0: 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d  d argument argum
6ec0: 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69  ent - doSeek - i
6ed0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  s false, then in
6ee0: 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74  stead of .** ret
6ef0: 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  urning the curso
6f00: 72 20 74 6f 20 69 74 27 73 20 73 61 76 65 64 20  r to it's saved 
6f10: 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61  position, any sa
6f20: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 73 20  ved position is 
6f30: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74  deleted.** and t
6f40: 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
6f50: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e  set to CURSOR_IN
6f60: 56 41 4c 49 44 2e 0a 2a 2f 0a 73 74 61 74 69 63  VALID..*/.static
6f70: 20 69 6e 74 20 72 65 73 74 6f 72 65 4f 72 43 6c   int restoreOrCl
6f80: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
6f90: 6e 58 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nX(BtCursor *pCu
6fa0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6fb0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6fc0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
6fd0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 70 43  UIRESEEK );.  pC
6fe0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6ff0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
7000: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
7010: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
7020: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
7030: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
7040: 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  kip);.  if( rc==
7050: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7060: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
7070: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
7080: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
7090: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
70a0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
70b0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
70c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
70d0: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
70e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
70f0: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
7100: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
7110: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7120: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
7130: 45 53 45 45 4b 3f 72 65 73 74 6f 72 65 4f 72 43  ESEEK?restoreOrC
7140: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
7150: 6f 6e 58 28 70 29 3a 53 51 4c 49 54 45 5f 4f 4b  onX(p):SQLITE_OK
7160: 29 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  )..#ifndef SQLIT
7170: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7180: 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61  M./*.** These ma
7190: 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20  cros define the 
71a0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
71b0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
71c0: 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64 61 74 61  y for a .** data
71d0: 62 61 73 65 20 70 61 67 65 2e 20 54 68 65 20 66  base page. The f
71e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
71f0: 20 65 61 63 68 20 69 73 20 74 68 65 20 6e 75 6d   each is the num
7200: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 0a 2a 2a  ber of usable.**
7210: 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20 70   bytes on each p
7220: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
7230: 61 73 65 20 28 6f 66 74 65 6e 20 31 30 32 34 29  ase (often 1024)
7240: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 69 73 20  . The second is 
7250: 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
7260: 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e  er to look up in
7270: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7280: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 50  ..**.** PTRMAP_P
7290: 41 47 45 4e 4f 20 72 65 74 75 72 6e 73 20 74 68  AGENO returns th
72a0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
72b0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 6f  number of the po
72c0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 70 61 67  inter-map.** pag
72d0: 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  e that stores th
72e0: 65 20 72 65 71 75 69 72 65 64 20 70 6f 69 6e 74  e required point
72f0: 65 72 2e 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  er. PTRMAP_PTROF
7300: 46 53 45 54 20 72 65 74 75 72 6e 73 0a 2a 2a 20  FSET returns.** 
7310: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7320: 65 20 72 65 71 75 65 73 74 65 64 20 6d 61 70 20  e requested map 
7330: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  entry..**.** If 
7340: 74 68 65 20 70 67 6e 6f 20 61 72 67 75 6d 65 6e  the pgno argumen
7350: 74 20 70 61 73 73 65 64 20 74 6f 20 50 54 52 4d  t passed to PTRM
7360: 41 50 5f 50 41 47 45 4e 4f 20 69 73 20 61 20 70  AP_PAGENO is a p
7370: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
7380: 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f 20 69 73  .** then pgno is
7390: 20 72 65 74 75 72 6e 65 64 2e 20 53 6f 20 28 70   returned. So (p
73a0: 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
73b0: 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f 29 29 20  NO(pgsz, pgno)) 
73c0: 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65 64 20 74  can be.** used t
73d0: 6f 20 74 65 73 74 20 69 66 20 70 67 6e 6f 20 69  o test if pgno i
73e0: 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  s a pointer-map 
73f0: 70 61 67 65 2e 20 50 54 52 4d 41 50 5f 49 53 50  page. PTRMAP_ISP
7400: 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  AGE implements.*
7410: 2a 20 74 68 69 73 20 74 65 73 74 2e 0a 2a 2f 0a  * this test..*/.
7420: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50  #define PTRMAP_P
7430: 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 29  AGENO(pBt, pgno)
7440: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 70 42   ptrmapPageno(pB
7450: 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  t, pgno).#define
7460: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
7470: 54 28 70 42 74 2c 20 70 67 6e 6f 29 20 28 35 2a  T(pBt, pgno) (5*
7480: 28 70 67 6e 6f 2d 70 74 72 6d 61 70 50 61 67 65  (pgno-ptrmapPage
7490: 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 2d 31 29  no(pBt, pgno)-1)
74a0: 29 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  ).#define PTRMAP
74b0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
74c0: 6f 29 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e  o) (PTRMAP_PAGEN
74d0: 4f 28 28 70 42 74 29 2c 28 70 67 6e 6f 29 29 3d  O((pBt),(pgno))=
74e0: 3d 28 70 67 6e 6f 29 29 0a 0a 73 74 61 74 69 63  =(pgno))..static
74f0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
7500: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
7510: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7520: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
7530: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
7540: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
7550: 69 6e 74 20 69 50 74 72 4d 61 70 20 3d 20 28 70  int iPtrMap = (p
7560: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7570: 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  MapPage;.  int r
7580: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
7590: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
75a0: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
75b0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
75c0: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
75d0: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
75e0: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
75f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7600: 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62   is a lookup tab
7610: 6c 65 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  le that identifi
7620: 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
7630: 67 65 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 63  ge for.** each c
7640: 68 69 6c 64 20 70 61 67 65 20 69 6e 20 74 68 65  hild page in the
7650: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7660: 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   The parent page
7670: 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
7680: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  t.** contains a 
7690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
76a0: 68 69 6c 64 2e 20 20 45 76 65 72 79 20 70 61 67  hild.  Every pag
76b0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
76c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 30 20  e contains.** 0 
76d0: 6f 72 20 31 20 70 61 72 65 6e 74 20 70 61 67 65  or 1 parent page
76e0: 73 2e 20 20 28 49 6e 20 74 68 69 73 20 63 6f 6e  s.  (In this con
76f0: 74 65 78 74 20 27 64 61 74 61 62 61 73 65 20 70  text 'database p
7700: 61 67 65 27 20 72 65 66 65 72 73 0a 2a 2a 20 74  age' refers.** t
7710: 6f 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  o any page that 
7720: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 74  is not part of t
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
7740: 74 73 65 6c 66 2e 29 20 20 45 61 63 68 20 70 6f  tself.)  Each po
7750: 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 65 6e 74  inter map.** ent
7760: 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ry consists of a
7770: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 27 74 79   single byte 'ty
7780: 70 65 27 20 61 6e 64 20 61 20 34 20 62 79 74 65  pe' and a 4 byte
7790: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
77a0: 62 65 72 2e 0a 2a 2a 20 54 68 65 20 50 54 52 4d  ber..** The PTRM
77b0: 41 50 5f 58 58 58 20 69 64 65 6e 74 69 66 69 65  AP_XXX identifie
77c0: 72 73 20 62 65 6c 6f 77 20 61 72 65 20 74 68 65  rs below are the
77d0: 20 76 61 6c 69 64 20 74 79 70 65 73 2e 0a 2a 2a   valid types..**
77e0: 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20  .** The purpose 
77f0: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  of the pointer m
7800: 61 70 20 69 73 20 74 6f 20 66 61 63 69 6c 69 74  ap is to facilit
7810: 79 20 6d 6f 76 69 6e 67 20 70 61 67 65 73 20 66  y moving pages f
7820: 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70 6f 73 69 74  rom one.** posit
7830: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ion in the file 
7840: 74 6f 20 61 6e 6f 74 68 65 72 20 61 73 20 70 61  to another as pa
7850: 72 74 20 6f 66 20 61 75 74 6f 76 61 63 75 75 6d  rt of autovacuum
7860: 2e 20 20 57 68 65 6e 20 61 20 70 61 67 65 0a 2a  .  When a page.*
7870: 2a 20 69 73 20 6d 6f 76 65 64 2c 20 74 68 65 20  * is moved, the 
7880: 70 6f 69 6e 74 65 72 20 69 6e 20 69 74 73 20 70  pointer in its p
7890: 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 75 70  arent must be up
78a0: 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  dated to point t
78b0: 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 6f 63  o the.** new loc
78c0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 6f 69 6e  ation.  The poin
78d0: 74 65 72 20 6d 61 70 20 69 73 20 75 73 65 64 20  ter map is used 
78e0: 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 70 61  to locate the pa
78f0: 72 65 6e 74 20 70 61 67 65 20 71 75 69 63 6b 6c  rent page quickl
7900: 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  y..**.** PTRMAP_
7910: 52 4f 4f 54 50 41 47 45 3a 20 54 68 65 20 64 61  ROOTPAGE: The da
7920: 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61  tabase page is a
7930: 20 72 6f 6f 74 2d 70 61 67 65 2e 20 54 68 65 20   root-page. The 
7940: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
7950: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ot.**           
7960: 20 20 20 20 20 20 20 75 73 65 64 20 69 6e 20 74         used in t
7970: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
7980: 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 3a  PTRMAP_FREEPAGE:
7990: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
79a0: 67 65 20 69 73 20 61 6e 20 75 6e 75 73 65 64 20  ge is an unused 
79b0: 28 66 72 65 65 29 20 70 61 67 65 2e 20 54 68 65  (free) page. The
79c0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 0a 2a 2a   page-number .**
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e    is not used in
79f0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
7a00: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
7a10: 57 31 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  W1: The database
7a20: 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
7a30: 73 74 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73  st page in a lis
7a40: 74 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 20  t of .**        
7a50: 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
7a60: 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
7a70: 61 67 65 20 6e 75 6d 62 65 72 20 69 64 65 6e 74  age number ident
7a80: 69 66 69 65 73 20 74 68 65 20 70 61 67 65 20 74  ifies the page t
7a90: 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
7aa0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e           contain
7ab0: 73 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  s the cell with 
7ac0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
7ad0: 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  s overflow page.
7ae0: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
7af0: 45 52 46 4c 4f 57 32 3a 20 54 68 65 20 64 61 74  ERFLOW2: The dat
7b00: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68  abase page is th
7b10: 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c 61 74 65  e second or late
7b20: 72 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73 74  r page in a list
7b30: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
7b40: 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
7b50: 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 61 67  w pages. The pag
7b60: 65 2d 6e 75 6d 62 65 72 20 69 64 65 6e 74 69 66  e-number identif
7b70: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
7b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7b90: 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 74 68        page in th
7ba0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
7bb0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  list..**.** PTRM
7bc0: 41 50 5f 42 54 52 45 45 3a 20 54 68 65 20 64 61  AP_BTREE: The da
7bd0: 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61  tabase page is a
7be0: 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74 72 65 65 20   non-root btree 
7bf0: 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 6e  page. The page n
7c00: 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
7c10: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
7c20: 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
7c30: 65 20 69 6e 20 74 68 65 20 62 74 72 65 65 2e 0a  e in the btree..
7c40: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  */.#define PTRMA
7c50: 50 5f 52 4f 4f 54 50 41 47 45 20 31 0a 23 64 65  P_ROOTPAGE 1.#de
7c60: 66 69 6e 65 20 50 54 52 4d 41 50 5f 46 52 45 45  fine PTRMAP_FREE
7c70: 50 41 47 45 20 32 0a 23 64 65 66 69 6e 65 20 50  PAGE 2.#define P
7c80: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
7c90: 33 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  3.#define PTRMAP
7ca0: 5f 4f 56 45 52 46 4c 4f 57 32 20 34 0a 23 64 65  _OVERFLOW2 4.#de
7cb0: 66 69 6e 65 20 50 54 52 4d 41 50 5f 42 54 52 45  fine PTRMAP_BTRE
7cc0: 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  E 5../*.** Write
7cd0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7ce0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
7cf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7d00: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7d10: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7d20: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7d30: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7d40: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7d50: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7d60: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7d70: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65   'pgno'..** An e
7d80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7d90: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
7da0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
7db0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
7dc0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
7dd0: 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  t ptrmapPut(BtSh
7de0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7df0: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
7e00: 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44  gno parent){.  D
7e10: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7e20: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7e30: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7e40: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
7e50: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7e60: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
7e70: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
7e80: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7e90: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
7ea0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7eb0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7ec0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7ed0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
7ee0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ef0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7f00: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7f10: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7f20: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7f30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7f40: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7f50: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7f60: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7f70: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7f80: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7f90: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
7fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7fb0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7fc0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7fd0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7fe0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7ff0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8000: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8010: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
8020: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8040: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
8050: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
8060: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50  (pBt, key);.  pP
8070: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
8080: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8090: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
80a0: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
80b0: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
80c0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
80d0: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
80e0: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
80f0: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
8100: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
8110: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
8120: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
8130: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
8140: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
8150: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8160: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
8170: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
8180: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
8190: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
81a0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
81b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
81c0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
81d0: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
81e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
81f0: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
8200: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
8210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8220: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
8230: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
8240: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
8250: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
8260: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
8270: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
8280: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8290: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
82a0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
82b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
82c0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
82d0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
82e0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
82f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8300: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
8310: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
8320: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
8330: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
8340: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
8350: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8360: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
8370: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
8380: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
8390: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
83a0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
83b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
83c0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
83d0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
83e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
83f0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
8400: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
8410: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
8420: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
8430: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
8440: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
8450: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
8460: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
8470: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8490: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
84a0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
84b0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
84c0: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
84d0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
84e0: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
84f0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
8500: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
8510: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8520: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8530: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8540: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8550: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8560: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8570: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
8580: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
85a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
85b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
85c0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
85d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
85e0: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
85f0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8600: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8610: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8620: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8630: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8640: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8650: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8660: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8670: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8680: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
86a0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
86b0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
86c0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
86d0: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
86e0: 75 38 20 2a 66 69 6e 64 43 65 6c 6c 28 4d 65 6d  u8 *findCell(Mem
86f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8700: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 64   iCell){.  u8 *d
8710: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
8720: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43  ta;.  assert( iC
8730: 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell>=0 );.  asse
8740: 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79  rt( iCell<get2by
8750: 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
8760: 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b  hdrOffset+3]) );
8770: 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 20 2b  .  return data +
8780: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8790: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
87a0: 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a  t+2*iCell]);.}..
87b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
87c0: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
87d0: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
87e0: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
87f0: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
8800: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
8810: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
8820: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
8830: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
8840: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
8850: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
8860: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
8870: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8880: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
8890: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
88a0: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
88b0: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
88c0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
88d0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
88e0: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
88f0: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
8900: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
8910: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8920: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
8930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8940: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
8950: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
8960: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
8970: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
8980: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8990: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
89a0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
89b0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
89c0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
89d0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
89e0: 6e 63 74 69 6f 6e 2e 20 20 70 61 72 73 65 43 65  nction.  parseCe
89f0: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 63 65 6c  ll() takes a cel
8a00: 6c 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  l index.** as th
8a10: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8a20: 74 20 61 6e 64 20 70 61 72 73 65 43 65 6c 6c 50  t and parseCellP
8a30: 74 72 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  tr() takes a poi
8a40: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 62  nter to the.** b
8a50: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
8a60: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
8a70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
8a80: 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c  c void parseCell
8a90: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
8aa0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
8ab0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
8ac0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
8ad0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
8af0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
8b00: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
8b10: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8b20: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8b30: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8b40: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8b60: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
8b70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
8b80: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
8b90: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
8ba0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
8bb0: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
8bc0: 61 64 20 2a 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e  ad */..  pInfo->
8bd0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
8be0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8bf0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
8c00: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
8c10: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
8c20: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
8c30: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
8c40: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
8c50: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
8c60: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
8c70: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
8c80: 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65  &nPayload);.  }e
8c90: 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
8ca0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  d = 0;.  }.  pIn
8cb0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
8cc0: 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67  load;.  if( pPag
8cd0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
8ce0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
8cf0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
8d00: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
8d10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33  .  }else{.    u3
8d20: 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  2 x;.    n += ge
8d30: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8d40: 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20 20 70 49  [n], &x);.    pI
8d50: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20  nfo->nKey = x;. 
8d60: 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78     nPayload += x
8d70: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8d80: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8d90: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
8da0: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
8db0: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
8dc0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
8dd0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
8de0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
8df0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
8e00: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
8e10: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
8e20: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
8e30: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
8e40: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
8e50: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
8e60: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
8e70: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
8e80: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
8e90: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8ea0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
8eb0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8ec0: 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20   = 0;.    nSize 
8ed0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
8ee0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
8ef0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
8f00: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
8f10: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
8f20: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
8f30: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8f40: 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b   nSize;.  }else{
8f50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
8f60: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8f70: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8f80: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8f90: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
8fa0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
8fb0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
8fc0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
8fd0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
8fe0: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
8ff0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
9000: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
9010: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
9020: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
9030: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
9040: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
9050: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
9060: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
9070: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
9080: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
9090: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
90a0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
90b0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
90c0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
90d0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
90e0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
90f0: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
9100: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
9110: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
9120: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9130: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
9140: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
9150: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
9160: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
9170: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
9180: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
9190: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
91a0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
91b0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
91c0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
91d0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
91e0: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
91f0: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
9200: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
9210: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
9220: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
9230: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
9240: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
9250: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9260: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9270: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
9280: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9290: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
92a0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
92b0: 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  = surplus;.    }
92c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
92d0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c  o->nLocal = minL
92e0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
92f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
9300: 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   = pInfo->nLocal
9310: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
9320: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
9330: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
9340: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9350: 20 70 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65   parseCell(.  Me
9360: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9370: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9380: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9390: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
93a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
93b0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
93c0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
93d0: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
93e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
93f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9400: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9410: 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
9420: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
9430: 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49  Page, iCell), pI
9440: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
9450: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
9460: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9470: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
9480: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
9490: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
94a0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
94b0: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
94c0: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
94d0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
94e0: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
94f0: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
9500: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
9510: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
9520: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
9530: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
9540: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9550: 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53  static int cellS
9560: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
9570: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
9580: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
9590: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
95a0: 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, iCell, &info
95b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
95c0: 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  .nSize;.}.#endif
95d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c  .static int cell
95e0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
95f0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9600: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
9610: 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c  nfo;.  parseCell
9620: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
9630: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
9640: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
9650: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9660: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
9670: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
9680: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
9690: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
96a0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
96b0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
96c0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
96d0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
96e0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
96f0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
9700: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
9710: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
9720: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
9730: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
9740: 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b  {.  if( pCell ){
9750: 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
9760: 66 6f 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c  fo;.    parseCel
9770: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
9780: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
9790: 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
97a0: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
97b0: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
97c0: 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
97d0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e  ;.    if( (info.
97e0: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
97f0: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
9800: 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
9810: 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66  {.      Pgno ovf
9820: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
9830: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
9840: 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ow]);.      retu
9850: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
9860: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9870: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9880: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
9890: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
98a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
98b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
98c0: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
98d0: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
98e0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
98f0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
9900: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
9910: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
9920: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
9930: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
9940: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
9950: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
9960: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
9970: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
9980: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
9990: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
99a0: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
99b0: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
99c0: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
99d0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
99e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ;.}.#endif.../* 
99f0: 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73 65 72  A bunch of asser
9a00: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9a10: 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72 61 6e  o check the tran
9a20: 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 76 61  saction state va
9a30: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 68 61  riables.** of ha
9a40: 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42 74 72  ndle p (type Btr
9a50: 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72 6e 61  ee*) are interna
9a60: 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
9a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72 65 65  */.#define btree
9a80: 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c 0a 20  Integrity(p) \. 
9a90: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
9aa0: 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
9ab0: 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  || p->pBt->nTran
9ac0: 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74 2d 3e  saction<p->pBt->
9ad0: 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73 73 65  nRef ); \.  asse
9ae0: 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61  rt( p->pBt->nTra
9af0: 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70 42 74  nsaction<=p->pBt
9b00: 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73  ->nRef ); \.  as
9b10: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e  sert( p->pBt->in
9b20: 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
9b30: 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42  NS_NONE || p->pB
9b40: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
9b50: 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65 72 74  =0 ); \.  assert
9b60: 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  ( p->pBt->inTran
9b70: 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e 54 72  saction>=p->inTr
9b80: 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 44  ans ); ../*.** D
9b90: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
9ba0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
9bb0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
9bc0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
9bd0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
9be0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
9bf0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
9c00: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
9c10: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
9c20: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
9c30: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
9c40: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
9c50: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9c60: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
9c70: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
9c80: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
9c90: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9cc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
9cf0: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
9d00: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d20: 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
9d30: 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20  byte after cell 
9d40: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
9d50: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
9d80: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
9d90: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
9da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9db0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
9dc0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
9dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9de0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
9df0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
9e00: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
9e10: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
9e20: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
9e30: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9e40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 72  rray */.  int br
9e50: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9e60: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9e70: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
9e80: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
9e90: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
9ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9eb0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
9ec0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
9ed0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
9ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
9ef0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
9f00: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
9f10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
9f20: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
9f30: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
9f40: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9f50: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9f60: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9f70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9f80: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
9f90: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
9fa0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
9fb0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
9fc0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
9fd0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9fe0: 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ==0 );.  temp = 
9ff0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
a000: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
a010: 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70  ze );.  if( temp
a020: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
a030: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74  ITE_NOMEM;.  dat
a040: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a050: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
a060: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
a070: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a080: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a090: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
a0a0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
a0b0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
a0c0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
a0d0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
a0e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a0f0: 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20  leSize;.  brk = 
a100: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a110: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
a120: 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61  (&temp[brk], &da
a130: 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
a140: 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72  ize - brk);.  br
a150: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
a160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
a170: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
a180: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
a190: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
a1a0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
a1b0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
a1c0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
a1d0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
a1e0: 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65  pAddr);.    asse
a1f0: 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42  rt( pc<pPage->pB
a200: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
a210: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
a220: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
a230: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62  temp[pc]);.    b
a240: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
a250: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b  memcpy(&data[brk
a260: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
a270: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
a280: 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20  e(pAddr, brk);. 
a290: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b   }.  assert( brk
a2a0: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
a2b0: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
a2c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a2d0: 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64   brk);.  data[hd
a2e0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
a2f0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
a300: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a310: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
a320: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
a330: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
a340: 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b  ], 0, brk-addr);
a350: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65  .  sqliteFree(te
a360: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mp);.  return SQ
a370: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a380: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
a390: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
a3a0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
a3b0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
a3c0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
a3d0: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
a3e0: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
a3f0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
a400: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
a410: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
a420: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
a430: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
a440: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
a450: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
a460: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
a470: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
a480: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
a490: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
a4a0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
a4b0: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
a4c0: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
a4d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
a4e0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
a4f0: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
a500: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
a510: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
a520: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
a530: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
a540: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
a550: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
a560: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
a570: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
a580: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
a590: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
a5a0: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
a5b0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
a5c0: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
a5d0: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
a5e0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
a5f0: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
a600: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
a610: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a620: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
a630: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
a640: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a650: 70 42 74 20 29 3b 0a 20 20 69 66 28 20 6e 42 79  pBt );.  if( nBy
a660: 74 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34  te<4 ) nByte = 4
a670: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
a680: 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50  Free<nByte || pP
a690: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
a6a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
a6b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e  Page->nFree -= n
a6c0: 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50  Byte;.  hdr = pP
a6d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a6e0: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
a6f0: 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46  hdr+7];.  if( nF
a700: 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a  rag<60 ){.    /*
a710: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
a720: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
a730: 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75   a slot big enou
a740: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
a750: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72  e.    ** space r
a760: 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61  equest. */.    a
a770: 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20  ddr = hdr+1;.   
a780: 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65   while( (pc = ge
a790: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a7a0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  r]))>0 ){.      
a7b0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a7c0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
a7d0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
a7e0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
a7f0: 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20  f( size<nByte+4 
a800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
a810: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
a820: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
a830: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
a840: 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20  dr+7] = nFrag + 
a850: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
a860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
a870: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
a880: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  {.          put2
a890: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
a8a0: 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20  , size-nByte);. 
a8b0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a8c0: 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  pc + size - nByt
a8d0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
a8e0: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
a8f0: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
a900: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
a910: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
a920: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
a930: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
a940: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
a950: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
a960: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
a970: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a980: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
a990: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
a9a0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
a9b0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a9c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a9d0: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
a9e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
a9f0: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
aa00: 79 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64  yte ){.    if( d
aa10: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
aa20: 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  age) ) return 0;
aa30: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
aa40: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
aa50: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
aa60: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
aa70: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
aa80: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
aa90: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
aaa0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
aab0: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
aac0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
aad0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
aae0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
aaf0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
ab00: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ab10: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
ab20: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
ab30: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
ab40: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
ab50: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
ab60: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
ab70: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
ab80: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
ab90: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
aba0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
abb0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
abc0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
abd0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
abe0: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
abf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ac00: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
ac10: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
ac20: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
ac30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
ac40: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
ac50: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
ac60: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ac70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ac80: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
ac90: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
aca0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
acb0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
acc0: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
acd0: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
ace0: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
acf0: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
ad00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
ad10: 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29  ;.  if( size<4 )
ad20: 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64   size = 4;..#ifd
ad30: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
ad40: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
ad50: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
ad60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
ad70: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
ad80: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
ad90: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
ada0: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
adb0: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
adc0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
add0: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
ade0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
adf0: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
ae00: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
ae10: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
ae20: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ae30: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
ae40: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
ae50: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
ae60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
ae70: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
ae80: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
ae90: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
aea0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
aeb0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73  Size-4 );.    as
aec0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
aed0: 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  r );.    addr = 
aee0: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73  pbegin;.  }.  as
aef0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
af00: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
af10: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65  Size-4 );.  asse
af20: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
af30: 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a  || pbegin==0 );.
af40: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
af50: 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a  [addr], start);.
af60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
af70: 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29  [start], pbegin)
af80: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
af90: 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a  ta[start+2], siz
afa0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
afb0: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f  ee += size;..  /
afc0: 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63  * Coalesce adjac
afd0: 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  ent free blocks 
afe0: 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67  */.  addr = pPag
aff0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31  e->hdrOffset + 1
b000: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
b010: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b020: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
b030: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
b040: 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  psize;.    asser
b050: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
b060: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
b070: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
b080: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
b090: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
b0a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b0b0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
b0c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b0d0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
b0e0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
b0f0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
b100: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
b110: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
b120: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
b130: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  +psize);.      a
b140: 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74  ssert( frag<=dat
b150: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
b160: 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64  et+7] );.      d
b170: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
b180: 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b  fset+7] -= frag;
b190: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
b1a0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67  &data[pbegin], g
b1b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
b1c0: 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75  ext]));.      pu
b1d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b1e0: 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65  gin+2], pnext+ge
b1f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
b200: 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a  xt+2])-pbegin);.
b210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b220: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
b230: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b240: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
b250: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
b260: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
b270: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
b280: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
b290: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
b2a0: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
b2b0: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
b2c0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
b2d0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
b2e0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
b2f0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b300: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
b310: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
b320: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
b330: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b340: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b350: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67  [hdr+5], top + g
b360: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
b370: 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d  egin+2]));.  }.}
b380: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
b390: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
b3a0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b3b0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
b3c0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
b3d0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
b3e0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
b3f0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
b400: 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ingly..*/.static
b410: 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67   void decodeFlag
b420: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
b430: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
b440: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b450: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
b460: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
b470: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b480: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
b490: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
b4a0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 70 50  100 : 0) );.  pP
b4b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66  age->intKey = (f
b4c0: 6c 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49  lagByte & (PTF_I
b4d0: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
b4e0: 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  TA))!=0;.  pPage
b4f0: 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c  ->zeroData = (fl
b500: 61 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52  agByte & PTF_ZER
b510: 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61  ODATA)!=0;.  pPa
b520: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67  ge->leaf = (flag
b530: 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29  Byte & PTF_LEAF)
b540: 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  !=0;.  pPage->ch
b550: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28  ildPtrSize = 4*(
b560: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b  pPage->leaf==0);
b570: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
b580: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
b590: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41  yte & PTF_LEAFDA
b5a0: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
b5b0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20  >leafData = 1;. 
b5c0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
b5d0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
b5e0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
b5f0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b600: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nLeaf;.  }else{.
b610: 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44      pPage->leafD
b620: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b630: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b640: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b650: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b660: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b670: 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  l;.  }.  pPage->
b680: 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67  hasData = !(pPag
b690: 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28  e->zeroData || (
b6a0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20  !pPage->leaf && 
b6b0: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29  pPage->leafData)
b6c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
b6d0: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
b6e0: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
b6f0: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
b700: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  k..**.** The pPa
b710: 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d  rent parameter m
b720: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
b730: 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
b740: 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20  which.** is the 
b750: 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61  parent of the pa
b760: 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c  ge being initial
b770: 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20  ized.  The root 
b780: 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61  of a.** BTree ha
b790: 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20  s no parent and 
b7a0: 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  so for that page
b7b0: 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e  , pParent==NULL.
b7c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
b7d0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
b7e0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
b7f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
b800: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
b810: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
b820: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
b830: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
b840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
b850: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
b860: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
b870: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
b880: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
b890: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
b8a0: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
b8b0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
b8c0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
b8d0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
b8e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74  .static int init
b8f0: 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
b900: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  *pPage,        /
b910: 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
b920: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
b930: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
b940: 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  nt       /* The 
b950: 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  parent.  Might b
b960: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
b970: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
b980: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b990: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b9a0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b9b0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  ] */.  int hdr; 
b9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b9d0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
b9e0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
b9f0: 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
ba00: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
ba10: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
ba20: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
ba30: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
ba40: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
ba50: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
ba60: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
ba70: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
ba80: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
ba90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
baa0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
bab0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
bac0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
bad0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
bae0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  r */.  int nFree
baf0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
bb00: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
bb10: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
bb20: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
bb30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bb40: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
bb50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
bb60: 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  /..  pBt = pPage
bb70: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
bb80: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73   pBt!=0 );.  ass
bb90: 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20  ert( pParent==0 
bba0: 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d  || pParent->pBt=
bbb0: 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  =pBt );.  assert
bbc0: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
bbd0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
bbe0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
bbf0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
bc00: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
bc10: 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63  == &((unsigned c
bc20: 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70 42 74  har*)pPage)[-pBt
bc30: 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a 20  ->pageSize] );. 
bc40: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
bc50: 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20  ent!=pParent && 
bc60: 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21  (pPage->pParent!
bc70: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49  =0 || pPage->isI
bc80: 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nit) ){.    /* T
bc90: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  he parent page s
bca0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e  hould never chan
bcb0: 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  ge unless the fi
bcc0: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f  le is corrupt */
bcd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bce0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bcf0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
bd00: 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ->isInit ) retur
bd10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
bd20: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
bd30: 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  t==0 && pParent!
bd40: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  =0 ){.    pPage-
bd50: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
bd60: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
bd70: 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
bd80: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
bd90: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
bda0: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
bdb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
bdc0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
bdd0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
bde0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
bdf0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
be00: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
be10: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
be20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
be30: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
be40: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
be50: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
be60: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
be70: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
be80: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
be90: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bea0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
beb0: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
bec0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
bed0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
bee0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
bef0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
bf00: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
bf10: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
bf20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bf40: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
bf50: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
bf60: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
bf70: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
bf80: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
bf90: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
bfa0: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
bfb0: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
bfc0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bfe0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
bff0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c000: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c010: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
c020: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c030: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
c040: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
c050: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
c060: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
c070: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
c080: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
c090: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
c0a0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
c0b0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
c0c0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
c0d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
c0e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c0f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c100: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
c110: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c120: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
c130: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c140: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
c150: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
c160: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
c170: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c180: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
c190: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
c1a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c1b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c1c0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
c1d0: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
c1e0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
c1f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c200: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
c210: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
c220: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
c230: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
c240: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
c250: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
c260: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c270: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
c280: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c2a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
c2b0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
c2c0: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
c2d0: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
c2e0: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
c2f0: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
c300: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
c310: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c320: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
c330: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c340: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
c350: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
c360: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
c370: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
c380: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c390: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
c3a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c3b0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c3c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c3d0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c3e0: 0a 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61  .  assert( &data
c3f0: 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  [pBt->pageSize] 
c400: 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  == (unsigned cha
c410: 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r*)pPage );.  as
c420: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c430: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c440: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c450: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c460: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
c470: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
c480: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66  .  data[hdr] = f
c490: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
c4a0: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
c4b0: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
c4c0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
c4d0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
c4e0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c4f0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
c500: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
c510: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
c520: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c530: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c540: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
c550: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
c560: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
c570: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
c580: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c590: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
c5a0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
c5b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 0;.  pPage->id
c5c0: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
c5d0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c5e0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c5f0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
c600: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c610: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
c620: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
c630: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
c640: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
c650: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
c660: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
c670: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
c680: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
c690: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
c6a0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
c6b0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
c6c0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
c6d0: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
c6e0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
c6f0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
c700: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
c710: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
c720: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
c730: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
c740: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
c750: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
c760: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
c770: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
c780: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
c790: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
c7a0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
c7b0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
c7c0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
c7d0: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
c7e0: 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 28  tic int getPage(
c7f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
c800: 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67  gno pgno, MemPag
c810: 65 20 2a 2a 70 70 50 61 67 65 2c 20 69 6e 74 20  e **ppPage, int 
c820: 6e 6f 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e  noContent){.  in
c830: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
c840: 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65  *pPage;.  DbPage
c850: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 72 63   *pDbPage;..  rc
c860: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
c870: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
c880: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
c890: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
c8a0: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
c8b0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c8c0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
c8d0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
c8e0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
c8f0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
c900: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
c910: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
c920: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
c930: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
c940: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
c950: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
c960: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
c970: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
c980: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c990: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
c9a0: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
c9b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c9c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
c9d0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c9e0: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
c9f0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
ca00: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
ca10: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
ca20: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
ca30: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
ca40: 67 65 74 50 61 67 65 28 29 20 61 6e 64 20 69 6e  getPage() and in
ca50: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
ca60: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
ca70: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
ca80: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
ca90: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
caa0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
cab0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
cac0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
cad0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
cae0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
caf0: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
cb00: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
cb10: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
cb20: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
cb30: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
cb40: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
cb50: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 67 6e  nt rc;.  if( pgn
cb60: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
cb70: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
cb80: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72  T_BKPT; .  }.  r
cb90: 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
cba0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
cbb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
cbc0: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
cbd0: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
cbe0: 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50  {.    rc = initP
cbf0: 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61  age(*ppPage, pPa
cc00: 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rent);.  }.  ret
cc10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cc20: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
cc30: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
cc40: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
cc50: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
cc60: 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74 50 61 67  * call to getPag
cc70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cc80: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
cc90: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
cca0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
ccb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ccc0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
ccd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
cce0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ccf0: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
cd00: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
cd10: 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63  ze]==(unsigned c
cd20: 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  har*)pPage );.  
cd30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
cd40: 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
cd50: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
cd60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
cd70: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
cd80: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
cd90: 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  t for a page.** 
cda0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 57  reaches zero.  W
cdb0: 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66 20  e need to unref 
cdc0: 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e  the pParent poin
cdd0: 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a  ter when that.**
cde0: 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61   happens..*/.sta
cdf0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65 73  tic void pageDes
ce00: 74 72 75 63 74 6f 72 28 44 62 50 61 67 65 20 2a  tructor(DbPage *
ce10: 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53  pData, int pageS
ce20: 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ize){.  MemPage 
ce30: 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
ce40: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
ce50: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ==0 );.  pPage =
ce60: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
ce70: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ce80: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70  (pData);.  if( p
ce90: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Page->pParent ){
cea0: 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
ceb0: 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
cec0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50 61 67  Parent;.    pPag
ced0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
cee0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cef0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
cf00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cf10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  0;.}../*.** Duri
cf20: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
cf30: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
cf40: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
cf50: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
cf60: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
cf70: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
cf80: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
cf90: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
cfa0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
cfb0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
cfc0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
cfd0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
cfe0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
cff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
d000: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
d010: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
d020: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
d030: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
d040: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
d050: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
d060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
d070: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
d080: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
d090: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
d0a0: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
d0b0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
d0c0: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
d0d0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d0e0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d0f0: 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  a(pData);.  if( 
d100: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
d110: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d120: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 69 74  it = 0;.    init
d130: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
d140: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e->pParent);.  }
d150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d160: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d170: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d180: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d190: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d1a0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d1b0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65   is NULL.** a ne
d1c0: 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  w database with 
d1d0: 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73  a random name is
d1e0: 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20   created.  This 
d1f0: 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a  randomly named.*
d200: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
d210: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
d220: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
d230: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
d240: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
d250: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
d260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d270: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
d280: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
d290: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
d2a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
d2b0: 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20  lite3 *pSqlite, 
d2c0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
d2d0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
d2e0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
d2f0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
d300: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
d310: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
d320: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
d330: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
d340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
d350: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  ions */.){.  BtS
d360: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
d370: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
d380: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
d390: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
d3a0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
d3b0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
d3c0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
d3d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d3e0: 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b  .  int nReserve;
d3f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d400: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
d410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d430: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
d440: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d450: 44 49 53 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20  DISKIO).  const 
d460: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
d470: 72 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ro;.#endif..  /*
d480: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
d490: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
d4a0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
d4b0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
d4c0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
d4d0: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
d4e0: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
d4f0: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
d500: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
d510: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
d520: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
d530: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
d540: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
d550: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
d560: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
d570: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d580: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
d590: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d5a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d5b0: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
d5c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
d5d0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
d5e0: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
d5f0: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
d600: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
d610: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
d620: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
d630: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
d640: 0a 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73  .#endif..  p = s
d650: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
d660: 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
d670: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
d680: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d690: 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
d6a0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
d6b0: 20 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70    p->pSqlite = p
d6c0: 53 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72  Sqlite;..  /* Tr
d6d0: 79 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69  y to find an exi
d6e0: 73 74 69 6e 67 20 42 74 72 65 65 20 73 74 72 75  sting Btree stru
d6f0: 63 74 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20  cture opened on 
d700: 7a 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69  zFilename. */.#i
d710: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d720: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
d730: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
d740: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
d750: 4b 49 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d 20  KIO).  pTsdro = 
d760: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
d770: 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69  aReadOnly();.  i
d780: 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68  f( pTsdro->useSh
d790: 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c  aredData && zFil
d7a0: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
d7b0: 62 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  b ){.    char *z
d7c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
d7d0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
d7e0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
d7f0: 0a 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50  .    if( !zFullP
d800: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
d810: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
d820: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d830: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
d840: 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73  .    for(pBt=pTs
d850: 64 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42 74  dro->pBtree; pBt
d860: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
d870: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d880: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
d890: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
d8a0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
d8b0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
d8c0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
d8d0: 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ger)) ){.       
d8e0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
d8f0: 20 20 20 20 20 20 20 2a 70 70 42 74 72 65 65 20         *ppBtree 
d900: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 42 74  = p;.        pBt
d910: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
d920: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
d930: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
d940: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d950: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
d960: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
d970: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
d980: 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  e);.  }.#endif..
d990: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
d9a0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
d9b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
d9c0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
d9d0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
d9e0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
d9f0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
da00: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
da10: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
da20: 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65   result.  ** whe
da30: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
da40: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
da50: 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  tecture..  */.  
da60: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
da70: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
da80: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (i64)==4 );.  as
da90: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
daa0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
dab0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65  64)==4 );.  asse
dac0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
dad0: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
dae0: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
daf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
db00: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a  of(Pgno)==4 );..
db10: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61    pBt = sqliteMa
db20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42  lloc( sizeof(*pB
db30: 74 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d  t) );.  if( pBt=
db40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
db50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
db60: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
db70: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
db80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
db90: 6e 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  n(&pBt->pPager, 
dba0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41  zFilename, EXTRA
dbb0: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20  _SIZE, flags);. 
dbc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dbd0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
dbe0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
dbf0: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
dc00: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
dc10: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
dc20: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
dc30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dc40: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
dc50: 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 2d  en_out;.  }.  p-
dc60: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73  >pBt = pBt;..  s
dc70: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
dc80: 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50  structor(pBt->pP
dc90: 61 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75  ager, pageDestru
dca0: 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctor);.  sqlite3
dcb0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
dcc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
dcd0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74  geReinit);.  pBt
dce0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
dcf0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
dd00: 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  ;.  pBt->readOnl
dd10: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
dd20: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
dd30: 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e  pPager);.  pBt->
dd40: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
dd50: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
dd60: 36 5d 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  6]);.  if( pBt->
dd70: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
dd80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
dd90: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
dda0: 5a 45 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 70  ZE.       || ((p
ddb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
ddc0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
ddd0: 30 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61  0 ){.    pBt->pa
dde0: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
ddf0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
de00: 45 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  E;.    pBt->maxE
de10: 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20 20  mbedFrac = 64;  
de20: 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20 70   /* 25% */.    p
de30: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
de40: 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35   = 32;   /* 12.5
de50: 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69  % */.    pBt->mi
de60: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
de70: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
de80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
de90: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dea0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
deb0: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
dec0: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
ded0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dee0: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ase, then.    **
def0: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
df00: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
df10: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
df20: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
df30: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
df40: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
df50: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
df60: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
df70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
df80: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
df90: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
dfa0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
dfb0: 75 73 74 20 61 0a 20 20 20 20 2a 2a 20 72 65 67  ust a.    ** reg
dfc0: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
dfd0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
dfe0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
dff0: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
e000: 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  al..    */.    i
e010: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
e020: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
e030: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e040: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
e050: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
e060: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70   1 : 0);.      p
e070: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
e080: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
e090: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
e0a0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 23   1 : 0);.    }.#
e0b0: 65 6e 64 69 66 0a 20 20 20 20 6e 52 65 73 65 72  endif.    nReser
e0c0: 76 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ve = 0;.  }else{
e0d0: 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
e0e0: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
e0f0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
e100: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
e110: 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [21];.    pBt->m
e120: 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44  inEmbedFrac = zD
e130: 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20  bHeader[22];.   
e140: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
e150: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
e160: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  ];.    pBt->page
e170: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
e180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e190: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e1a0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e1b0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
e1c0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
e1d0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
e1e0: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
e1f0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
e200: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
e210: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  e;.  assert( (pB
e220: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
e230: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
e240: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
e250: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 73 71 6c  ageSize */.  sql
e260: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
e270: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
e280: 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
e290: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
e2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
e2b0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
e2c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e2d0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 41  T_DISKIO).  /* A
e2e0: 64 64 20 74 68 65 20 6e 65 77 20 62 74 72 65 65  dd the new btree
e2f0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
e300: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
e310: 54 68 72 65 61 64 44 61 74 61 2e 70 42 74 72 65  ThreadData.pBtre
e320: 65 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73  e..  ** There is
e330: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
e340: 61 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 66  a malloc() may f
e350: 61 69 6c 20 69 6e 73 69 64 65 20 6f 66 20 74 68  ail inside of th
e360: 65 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 54  e .  ** sqlite3T
e370: 68 72 65 61 64 44 61 74 61 28 29 20 63 61 6c 6c  hreadData() call
e380: 2c 20 61 73 20 74 68 65 20 54 68 72 65 61 64 44  , as the ThreadD
e390: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 6d 75  ata structure mu
e3a0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  st have already.
e3b0: 20 20 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61    ** been alloca
e3c0: 74 65 64 20 66 6f 72 20 70 54 73 64 72 6f 2d 3e  ted for pTsdro->
e3d0: 75 73 65 53 68 61 72 65 64 44 61 74 61 20 74 6f  useSharedData to
e3e0: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20   be non-zero..  
e3f0: 2a 2f 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d  */.  if( pTsdro-
e400: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26  >useSharedData &
e410: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  & zFilename && !
e420: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 70  isMemdb ){.    p
e430: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  Bt->pNext = pTsd
e440: 72 6f 2d 3e 70 42 74 72 65 65 3b 0a 20 20 20 20  ro->pBtree;.    
e450: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e460: 61 28 29 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  a()->pBtree = pB
e470: 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
e480: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
e490: 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
e4a0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
e4b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e4c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
e4d0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
e4e0: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
e4f0: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
e500: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
e510: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e520: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
e530: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  Free(p);.    *pp
e540: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
e550: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e560: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
e570: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
e580: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
e590: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
e5a0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e5b0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
e5c0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e5d0: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
e5e0: 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66   *pCur;..#ifndef
e5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
e600: 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68 72 65  RED_CACHE.  Thre
e610: 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 23 65  adData *pTsd;.#e
e620: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ndif..  /* Close
e630: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
e640: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
e650: 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20  dle.  */.  pCur 
e660: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
e670: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
e680: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
e690: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
e6a0: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
e6b0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
e6c0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
e6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e6e0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
e6f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
e700: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
e710: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
e720: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
e730: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
e740: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
e750: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
e760: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
e770: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
e780: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
e790: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
e7a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
e7b0: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
e7c0: 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23 69 66  iteFree(p);..#if
e7d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e7e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
e7f0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e800: 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
e810: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
e820: 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
e830: 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
e840: 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
e850: 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
e860: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
e870: 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
e880: 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
e890: 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
e8a0: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
e8b0: 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
e8c0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
e8d0: 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
e8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
e8f0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
e900: 73 68 61 72 65 64 2d 62 74 72 65 65 20 66 72 6f  shared-btree fro
e910: 6d 20 74 68 65 20 74 68 72 65 61 64 20 77 69 64  m the thread wid
e920: 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20  e list. Call .  
e930: 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52 65 61  ** ThreadDataRea
e940: 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68 65 6e  dOnly() and then
e950: 20 63 61 73 74 20 61 77 61 79 20 74 68 65 20 63   cast away the c
e960: 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20 6f 66  onst property of
e970: 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74   the .  ** point
e980: 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f  er to avoid allo
e990: 63 61 74 69 6e 67 20 74 68 72 65 61 64 20 64 61  cating thread da
e9a0: 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ta if it is not 
e9b0: 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
e9c0: 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28  .  */.  pTsd = (
e9d0: 54 68 72 65 61 64 44 61 74 61 20 2a 29 73 71 6c  ThreadData *)sql
e9e0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
e9f0: 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20  adOnly();.  if( 
ea00: 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42  pTsd->pBtree==pB
ea10: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
ea20: 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54 68   pTsd==sqlite3Th
ea30: 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20 20  readData() );.  
ea40: 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65 20 3d    pTsd->pBtree =
ea50: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   pBt->pNext;.  }
ea60: 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68 61 72  else{.    BtShar
ea70: 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20 20 66  ed *pPrev;.    f
ea80: 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d 3e 70  or(pPrev=pTsd->p
ea90: 42 74 72 65 65 3b 20 70 50 72 65 76 20 26 26 20  Btree; pPrev && 
eaa0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42  pPrev->pNext!=pB
eab0: 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76 2d 3e  t; pPrev=pPrev->
eac0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  pNext){}.    if(
ead0: 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20   pPrev ){.      
eae0: 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71  assert( pTsd==sq
eaf0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
eb00: 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  ) );.      pPrev
eb10: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
eb20: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
eb30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f  #endif..  /* Clo
eb40: 73 65 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  se the pager and
eb50: 20 66 72 65 65 20 74 68 65 20 73 68 61 72 65 64   free the shared
eb60: 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
eb70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
eb80: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
eb90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
eba0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
ebb0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65  .  if( pBt->xFre
ebc0: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
ebd0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
ebe0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
ebf0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
ec00: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
ec10: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
ec20: 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29   sqliteFree(pBt)
ec30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ec40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ec50: 68 61 6e 67 65 20 74 68 65 20 62 75 73 79 20 68  hange the busy h
ec60: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
ec70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
ec80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
ec90: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74 72 65  BusyHandler(Btre
eca0: 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64 6c 65  e *p, BusyHandle
ecb0: 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20  r *pHandler){.  
ecc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ecd0: 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70  p->pBt;.  pBt->p
ece0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48  BusyHandler = pH
ecf0: 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65  andler;.  sqlite
ed00: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
ed10: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
ed20: 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72  , pHandler);.  r
ed30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ed40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ed50: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
ed60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ed70: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
ed80: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
ed90: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
eda0: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
edb0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
edc0: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
edd0: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
ede0: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
edf0: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
ee00: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
ee10: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
ee20: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
ee30: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
ee40: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
ee50: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ee60: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
ee70: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
ee80: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
ee90: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
eea0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
eeb0: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
eec0: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
eed0: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
eee0: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
eef0: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
ef00: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
ef10: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
ef20: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
ef30: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
ef40: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
ef50: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
ef60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
ef70: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
ef80: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
ef90: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
efa0: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
efb0: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
efc0: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
efd0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
efe0: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
eff0: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
f000: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
f010: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
f020: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
f030: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f040: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
f050: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
f060: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
f070: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 72  er, mxPage);.  r
f080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
f0a0: 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
f0b0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
f0c0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
f0d0: 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
f0e0: 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
f0f0: 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
f100: 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
f110: 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
f120: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
f130: 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
f140: 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
f150: 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
f160: 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
f170: 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
f180: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
f190: 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
f1a0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
f1b0: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
f1c0: 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
f1d0: 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
f1e0: 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
f1f0: 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
f200: 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
f210: 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
f220: 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
f230: 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
f240: 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
f250: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f260: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
f270: 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
f280: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
f290: 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
f2a0: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
f2b0: 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
f2c0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f2d0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
f2e0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
f2f0: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
f300: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72  , fullSync);.  r
f310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f320: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f330: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f340: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
f350: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
f360: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
f370: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
f380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
f390: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
f3a0: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
f3b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
f3c0: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
f3d0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
f3e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
f3f0: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
f400: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
f410: 65 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  er );.  return s
f420: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
f430: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
f440: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
f450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f460: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
f470: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f480: 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
f490: 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
f4a0: 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
f4b0: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
f4c0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
f4d0: 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  per page..**.** 
f4e0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
f4f0: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
f500: 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
f510: 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
f520: 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
f530: 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
f540: 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
f550: 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
f560: 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
f570: 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
f580: 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
f590: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
f5a0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
f5b0: 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
f5c0: 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
f5d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
f5e0: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
f5f0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
f600: 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
f610: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
f620: 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
f630: 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
f640: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
f650: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
f660: 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
f670: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
f680: 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
f690: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
f6a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f6b0: 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
f6c0: 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
f6d0: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
f6e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f6f0: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
f700: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
f710: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
f720: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f730: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
f740: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
f750: 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74  Fixed ){.    ret
f760: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
f770: 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
f780: 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
f790: 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
f7a0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
f7b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
f7c0: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
f7d0: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
f7e0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
f7f0: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
f800: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
f810: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
f820: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
f830: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
f840: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
f850: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
f860: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
f870: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f880: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
f890: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
f8a0: 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65 29  Pager, pageSize)
f8b0: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
f8c0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
f8d0: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
f8e0: 76 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ve;.  return SQL
f8f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f900: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
f910: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
f920: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
f930: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
f940: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
f950: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
f960: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
f970: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
f980: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
f990: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
f9a0: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
f9b0: 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
f9c0: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
f9d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f9e0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
f9f0: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
fa00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
fa10: 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
fa20: 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
fa30: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
fa40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
fa50: 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
fa60: 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
fa70: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
fa80: 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
fa90: 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
faa0: 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
fab0: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
fac0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
fad0: 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
fae0: 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
faf0: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
fb00: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
fb10: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
fb20: 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
fb30: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
fb40: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
fb50: 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
fb60: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
fb70: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
fb80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fb90: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
fba0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
fbb0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
fbc0: 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75   av = (autoVacuu
fbd0: 6d 3f 31 3a 30 29 3b 0a 20 20 69 6e 74 20 69 76  m?1:0);.  int iv
fbe0: 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3d 3d   = (autoVacuum==
fbf0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
fc00: 5f 49 4e 43 52 3f 31 3a 30 29 3b 0a 20 20 69 66  _INCR?1:0);.  if
fc10: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
fc20: 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74 2d  ixed && av!=pBt-
fc30: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
fc40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc50: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
fc60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fc70: 20 3d 20 61 76 3b 0a 20 20 70 42 74 2d 3e 69 6e   = av;.  pBt->in
fc80: 63 72 56 61 63 75 75 6d 20 3d 20 69 76 3b 0a 20  crVacuum = iv;. 
fc90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fca0: 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  K;.#endif.}../*.
fcb0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
fcc0: 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
fcd0: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
fce0: 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
fcf0: 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
fd00: 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
fd10: 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
fd20: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
fd30: 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
fd40: 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
fd50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fd60: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
fd70: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
fd80: 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 72  _NONE;.#else.  r
fd90: 65 74 75 72 6e 20 28 0a 20 20 20 20 28 21 70 2d  eturn (.    (!p-
fda0: 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
fdb0: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
fdc0: 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
fdd0: 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
fde0: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
fdf0: 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
fe00: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
fe10: 4e 43 52 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  NCR.  );.#endif.
fe20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
fe30: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
fe40: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
fe50: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
fe60: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
fe70: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
fe80: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
fe90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
fea0: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
feb0: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
fec0: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
fed0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
fee0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
fef0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
ff00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
ff10: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
ff20: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
ff30: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
ff40: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
ff50: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
ff60: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
ff70: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
ff80: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
ff90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ffa0: 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53 69    int rc, pageSi
ffb0: 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ze;.  MemPage *p
ffc0: 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42 74  Page1;.  if( pBt
ffd0: 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75 72  ->pPage1 ) retur
ffe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  n SQLITE_OK;.  r
fff0: 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
10000 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
10010 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10020 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10030 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f  ;.  ..  /* Do so
10040 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
10050 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
10060 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
10070 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
10080 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
10090 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
100a0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
100b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
100c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
100d0 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
100e0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
100f0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
10100 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
10110 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
10120 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
10130 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10140 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10150 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
10160 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
10170 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
10180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
10190 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
101a0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
101b0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
101c0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
101d0 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
101e0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
101f0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
10200 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
10210 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 20  ize<512 ){.     
10220 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10230 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10240 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
10250 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
10260 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10270 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
10280 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
10290 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
102a0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
102b0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
102c0 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
102d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
102e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
102f0 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
10300 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
10310 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
10320 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
10330 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
10340 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
10350 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
10360 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10370 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
10380 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
10390 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
103a0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  4*4])?1:0);.#end
103b0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
103c0 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
103d0 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
103e0 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
103f0 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
10400 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
10410 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
10420 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
10430 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
10440 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
10450 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
10460 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
10470 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
10480 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
10490 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
104a0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
104b0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
104c0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
104d0 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
104e0 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
104f0 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
10500 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
10510 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
10520 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
10530 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10540 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
10550 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
10560 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
10570 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
10580 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
10590 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
105a0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
105b0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
105c0 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
105d0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
105e0 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
105f0 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
10600 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
10610 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
10620 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
10630 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32 35  >maxEmbedFrac/25
10640 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
10650 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
10660 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
10670 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
10680 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
10690 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
106a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
106b0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
106c0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
106d0 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
106e0 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20 32  LeafFrac/255 - 2
106f0 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
10700 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
10710 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
10720 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
10730 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
10740 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
10750 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
10760 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
10770 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
10780 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
10790 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
107a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
107b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
107c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
107d0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
107e0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
107f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10800 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
10810 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
10820 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
10830 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
10840 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
10850 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
10860 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
10870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
10880 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
10890 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
108a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
108b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52 65 66  E_OK;.  if( pRef
108c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
108d0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
108e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
108f0 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
10900 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
10910 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
10920 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
10930 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
10940 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
10950 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
10960 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
10970 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
10980 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
10990 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
109a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
109b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
109c0 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
109d0 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
109e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
109f0 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
10a00 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
10a10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
10a20 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
10a30 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
10a40 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
10a50 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
10a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
10a70 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
10a80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10a90 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
10aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
10ab0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
10ac0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10ad0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
10ae0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
10af0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
10b00 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
10b10 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
10b20 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
10b30 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
10b40 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
10b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10b60 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
10b70 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
10b80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10b90 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
10ba0 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
10bb0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
10bc0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
10bd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10be0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
10bf0 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
10c00 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
10c10 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
10c20 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
10c30 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10c40 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=1 ){.      if(
10c50 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
10c60 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
10c70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10c80 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
10c90 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61          pPage->a
10ca0 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70 50  Data = &((u8*)pP
10cb0 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  age)[-pBt->pageS
10cc0 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50  ize];.        pP
10cd0 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10ce0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
10cf0 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  gno = 1;.      }
10d00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10d10 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
10d20 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
10d30 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
10d40 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
10d50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
10d60 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62  eate a new datab
10d70 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
10d80 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
10d90 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ge of the.** fil
10da0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10db0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
10dc0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10dd0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
10de0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
10df0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ta;.  int rc;.  
10e00 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
10e10 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
10e20 50 61 67 65 72 29 3e 30 20 29 20 72 65 74 75 72  Pager)>0 ) retur
10e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
10e40 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
10e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
10e60 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
10e70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
10e80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
10e90 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
10ea0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
10eb0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
10ec0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
10ed0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
10ee0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
10ef0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
10f00 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
10f10 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
10f20 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61  ata[16], pBt->pa
10f30 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
10f40 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
10f50 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  19] = 1;.  data[
10f60 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  20] = pBt->pageS
10f70 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
10f80 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31  eSize;.  data[21
10f90 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65  ] = pBt->maxEmbe
10fa0 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 32  dFrac;.  data[22
10fb0 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  ] = pBt->minEmbe
10fc0 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 33  dFrac;.  data[23
10fd0 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ] = pBt->minLeaf
10fe0 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Frac;.  memset(&
10ff0 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
11000 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
11010 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
11020 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
11030 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
11040 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
11050 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
11060 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11070 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
11080 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
11090 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
110a0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
110b0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
110c0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
110d0 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
110e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
110f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
11100 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
11110 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
11120 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11130 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
11140 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
11150 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
11160 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
11170 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
11180 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
11190 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
111a0 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
111b0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
111c0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
111d0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
111e0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
111f0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
11200 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
11210 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
11220 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
11230 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
11240 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
11250 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
11260 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
11270 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
11280 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
11290 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
112a0 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
112b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
112c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
112d0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
112e0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
112f0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
11300 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
11310 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
11320 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
11330 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
11340 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
11350 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
11360 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
11370 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11380 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
11390 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
113a0 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
113b0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
113c0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
113d0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
113e0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
113f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11400 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
11410 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11420 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
11430 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11440 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
11450 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
11460 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
11470 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
11480 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
11490 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
114a0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
114b0 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
114c0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
114d0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
114e0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
114f0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
11500 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
11510 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
11520 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
11530 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
11540 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
11550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11560 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
11570 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
11580 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
11590 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
115a0 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
115b0 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
115c0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
115d0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
115e0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
115f0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
11600 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
11610 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
11620 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
11630 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
11640 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
11650 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
11660 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
11670 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
11680 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
11690 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
116a0 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
116b0 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
116c0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
116d0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
116e0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
116f0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
11700 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
11710 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
11720 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
11730 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
11740 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
11750 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
11760 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
11770 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
11780 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
11790 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
117a0 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
117b0 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
117c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
117d0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
117e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
117f0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
11800 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
11810 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
11820 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
11830 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
11840 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
11850 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
11860 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
11870 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
11880 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
11890 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
118a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
118b0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
118c0 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
118d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
118e0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
118f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11900 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  _OK;.  }..  /* W
11910 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11920 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
11930 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
11940 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
11950 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
11960 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
11970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11980 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _READONLY;.  }..
11990 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
119a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
119b0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
119c0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
119d0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
119e0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
119f0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
11a00 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
11a10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
11a20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
11a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
11a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
11a50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
11a60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
11a70 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrflag ){.    re
11a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
11a90 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20  ;.  }..  do {.  
11aa0 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
11ab0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  1==0 ){.      rc
11ac0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
11ad0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
11ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11af0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
11b00 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
11b10 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
11b30 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
11b40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
11b50 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
11b60 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  n(pBt->pPage1->p
11b70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e 31  DbPage, wrflag>1
11b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11ba0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
11bb0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
11bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11bd0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
11be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11bf0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  K ){.      if( w
11c00 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53  rflag ) pBt->inS
11c10 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
11c20 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b  se{.      unlock
11c30 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
11c40 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
11c50 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
11c60 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
11c70 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11c80 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
11c90 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65     sqlite3Invoke
11ca0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d  BusyHandler(pBt-
11cb0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
11cc0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
11cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11ce0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11cf0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
11d00 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
11d10 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
11d20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
11d30 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
11d40 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
11d50 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11d60 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
11d70 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
11d80 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11d90 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
11da0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65     }.  }..  btre
11db0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
11dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11dd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11de0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
11df0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
11e00 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
11e10 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
11e20 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
11e30 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
11e40 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
11e50 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
11e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
11e70 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
11e80 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
11e90 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
11ea0 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
11eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
11ec0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
11ed0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
11ee0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
11f10 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
11f20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
11f50 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
11f60 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11f70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
11f80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11f90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
11fa0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
11fb0 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
11fc0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
11fd0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
11fe0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
11ff0 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74 50 61 67 65  gno;..  initPage
12000 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 6e 43  (pPage, 0);.  nC
12010 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
12020 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
12030 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12040 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
12050 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
12060 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
12070 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
12080 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
12090 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
120a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
120b0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
120c0 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
120d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
120e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
120f0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
12100 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
12110 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
12120 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
12130 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
12140 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
12150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12160 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
12170 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
12180 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
12190 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
121a0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
121b0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
121c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
121d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
121e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
121f0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
12200 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
12210 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
12220 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
12230 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
12240 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
12250 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
12260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
12270 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
12280 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
12290 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
122a0 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
122b0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
122c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
122d0 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
122e0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
122f0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
12300 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
12310 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
12320 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
12330 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
12340 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
12350 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12360 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
12370 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
12380 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
12390 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
123a0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
123c0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
123d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
123e0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
123f0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
12400 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
12410 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
12440 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
12450 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
12460 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
12470 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
12480 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
12490 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
124a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
124b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
124c0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
124d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
124e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
124f0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
12500 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
12510 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
12520 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
12530 29 7b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ){.  if( eType==
12540 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
12550 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
12560 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
12570 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
12580 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
12590 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
125a0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
125b0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
125c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
125d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
125e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
125f0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
12600 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
12610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12620 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
12630 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
12640 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
12650 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 69  nt nCell;..    i
12660 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
12670 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
12680 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
12690 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
126a0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
126b0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
126c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
126d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
126e0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
126f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
12700 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
12710 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
12720 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
12730 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
12740 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
12750 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
12760 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
12770 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
12780 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
12790 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
127a0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
127b0 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
127c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
127d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
127e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
127f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
12800 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
12810 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
12820 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12830 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
12840 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12860 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
12870 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
12880 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
12890 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
128a0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
128b0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
128c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
128d0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
128e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
128f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12900 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
12910 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
12920 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
12930 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
12940 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
12950 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
12960 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
12970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12980 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
12990 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
129a0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
129b0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
129c0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
129d0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
129e0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
129f0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
12a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
12a10 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
12a20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12a30 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
12a40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
12a50 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
12a60 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
12a70 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
12a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12a90 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
12aa0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
12ab0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
12ac0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
12ad0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12ae0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
12af0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
12b00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
12b10 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  ePage           
12b20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
12b30 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
12b40 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  to */.){.  MemPa
12b50 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
12b60 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
12b70 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
12b80 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
12b90 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
12ba0 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
12bb0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
12bc0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
12bd0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
12be0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
12bf0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
12c00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
12c10 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
12c20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
12c30 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
12c40 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
12c50 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
12c60 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
12c70 20 69 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f   it's current lo
12c80 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
12c90 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
12ca0 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
12cb0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
12cc0 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
12cd0 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
12ce0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
12cf0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
12d00 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
12d10 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
12d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
12d30 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
12d40 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
12d50 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69   iFreePage);.  i
12d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12d80 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
12d90 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
12da0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
12db0 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
12dc0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
12dd0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
12de0 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
12df0 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
12e00 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
12e10 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
12e20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
12e30 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
12e40 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
12e50 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
12e60 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
12e70 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
12e80 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
12e90 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
12ea0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
12eb0 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
12ec0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
12ed0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
12ee0 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
12ef0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
12f00 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
12f10 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
12f20 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
12f30 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
12f40 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
12f50 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
12f60 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
12f70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
12f80 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
12f90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
12fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12fb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12fc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12fd0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
12fe0 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
12ff0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
13000 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
13010 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
13020 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
13030 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
13040 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
13050 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
13060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13070 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13080 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13090 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
130a0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
130b0 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
130c0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
130d0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
130e0 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
130f0 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
13100 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
13110 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
13120 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
13130 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
13140 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
13150 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
13160 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
13170 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
13180 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
13190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
131a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
131b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
131c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
131d0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
131e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
131f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13200 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13210 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
13220 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13230 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
13240 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13250 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13260 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13270 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
13280 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
13290 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
132a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
132b0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
132c0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
132d0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
132e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
132f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
13300 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
13310 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
13320 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
13330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
13340 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13350 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
13360 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
13370 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
13380 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
13390 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
133a0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
133b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
133c0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
133d0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
133e0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
133f0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
13400 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
13410 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
13420 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
13430 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
13440 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
13450 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
13460 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
13470 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
13480 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
13490 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
134a0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
134b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
134c0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
134d0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
134e0 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
134f0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
13500 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
13510 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
13520 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
13530 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
13540 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
13550 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
13560 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
13570 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
13580 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
13590 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
135a0 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
135b0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
135c0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
135d0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
135e0 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
135f0 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
13600 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
13610 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
13620 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50  ){.  Pgno iLastP
13630 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
13640 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74  * Last page in t
13650 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
13660 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
13670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13680 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
13690 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
136a0 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 4c 61 73 74  list */..  iLast
136b0 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  Pg = pBt->nTrunc
136c0 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d  ;.  if( iLastPg=
136d0 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
136e0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
136f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
13700 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
13710 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
13720 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
13730 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
13740 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13750 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
13760 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
13770 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
13780 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
13790 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
137a0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
137b0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
137c0 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e  FreeList==0 || n
137d0 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a  Fin==iLastPg ){.
137e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
137f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
13800 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
13810 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
13820 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
13830 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13850 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13860 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
13870 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13880 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
13890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
138a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
138b0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
138c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
138d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69  ){.      if( nFi
138e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
138f0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
13900 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
13910 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
13920 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
13930 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
13940 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nFin is non-zero
13950 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
13960 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
13970 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
13980 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
13990 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
139a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
139b0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
139c0 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
139d0 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
139e0 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
139f0 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
13a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
13a10 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
13a20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
13a30 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
13a40 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
13a50 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
13a60 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
13a70 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20  LastPg, 1);.    
13a80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13aa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13ac0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
13ad0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
13ae0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13af0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
13b00 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
13b10 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
13b20 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
13b30 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
13b40 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
13b50 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
13b60 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
13b70 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 67  g;..      rc = g
13b80 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
13b90 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
13ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13bc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13bd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13be0 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
13bf0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
13c00 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
13c10 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
13c20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
13c30 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
13c40 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
13c50 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
13c60 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
13c70 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
13c80 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
13c90 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
13ca0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
13cb0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
13cc0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
13cd0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
13ce0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
13cf0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
13d00 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
13d10 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
13d20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
13d30 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
13d40 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
13d50 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
13d60 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
13d70 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
13d80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
13d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13da0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
13db0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
13dc0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
13dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13de0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
13df0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
13e00 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
13e10 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
13e20 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
13e30 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
13e40 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
13e50 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
13e60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
13e70 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
13e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13eb0 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20  .      } .      
13ec0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
13ed0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
13ee0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
13ef0 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20   iFreePg);.     
13f00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
13f10 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
13f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13f40 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20   rc;.      } .  
13f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e    }.  }..  pBt->
13f60 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67  nTrunc = iLastPg
13f70 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70   - 1;.  while( p
13f80 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44  Bt->nTrunc==PEND
13f90 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13fa0 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
13fb0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75  E(pBt, pBt->nTru
13fc0 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  nc) ){.    pBt->
13fd0 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20  nTrunc--;.  }.  
13fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
14000 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
14010 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
14020 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
14030 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
14040 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
14050 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
14060 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
14070 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
14080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
14090 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
140a0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
140b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
140c0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
140d0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
140e0 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
140f0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
14100 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  no error occured
14110 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
14120 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
14130 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
14140 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
14150 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14160 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
14170 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
14180 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14190 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
141a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
141b0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
141c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
141d0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
141e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
141f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14200 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
14210 20 20 72 65 74 75 72 6e 20 69 6e 63 72 56 61 63    return incrVac
14220 75 75 6d 53 74 65 70 28 70 2d 3e 70 42 74 2c 20  uumStep(p->pBt, 
14230 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
14240 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14250 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
14260 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
14270 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
14280 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
14290 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
142a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
142b0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
142c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
142d0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
142e0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
142f0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
14300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14310 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
14320 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
14330 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
14340 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
14350 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
14360 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
14370 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
14380 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
14390 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
143a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
143b0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
143c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
143d0 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a  Pgno *pnTrunc){.
143e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
143f0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
14400 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
14410 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ger;.#ifndef NDE
14420 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d  BUG.  int nRef =
14430 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
14440 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  count(pPager);.#
14450 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14460 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
14470 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
14480 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
14490 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
144a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
144b0 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
144c0 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
144d0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
144e0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
144f0 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
14500 53 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Size;.      Pgno
14510 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33   nOrig = sqlite3
14520 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
14530 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
14540 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
14550 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
14560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
14570 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14580 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
14590 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
145a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
145b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
145c0 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
145d0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
145e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
145f0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
14600 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
14610 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
14620 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
14630 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
14640 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
14650 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
14660 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
14670 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
14680 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
14690 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
146a0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
146b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
146c0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
146d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
146e0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
146f0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
14700 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
14710 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
14720 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
14730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14740 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
14750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14760 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
14770 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
14780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
14790 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
147a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
147b0 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
147c0 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
147d0 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
147e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
147f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
14800 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
14810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
14820 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
14830 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
14840 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14850 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
14860 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
14870 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
14880 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
14890 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
148a0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
148b0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
148c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
148d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
148e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
148f0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14920 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e  K ){.    *pnTrun
14930 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  c = pBt->nTrunc;
14940 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  .    pBt->nTrunc
14950 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
14960 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65  rt( nRef==sqlite
14970 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
14980 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
14990 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
149a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
149b0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
149c0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
149d0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
149e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
149f0 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
14a00 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
14a10 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
14a20 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
14a30 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
14a40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
14a50 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
14a60 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
14a70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
14a80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14a90 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
14aa0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
14ab0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
14ac0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
14ad0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
14ae0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14af0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
14b00 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
14b10 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
14b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
14b30 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
14b40 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
14b50 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
14b60 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
14b70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14b80 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
14b90 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
14ba0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
14bb0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
14bc0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
14bd0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
14be0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
14bf0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
14c00 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
14c10 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
14c20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
14c30 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
14c40 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20  reeCommit() for 
14c50 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
14c60 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
14c70 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
14c80 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
14c90 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
14ca0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
14cb0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
14cc0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
14cd0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
14ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14cf0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
14d00 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
14d10 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
14d20 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
14d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
14d40 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
14d50 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
14d60 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
14d70 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
14d80 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
14d90 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
14da0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
14db0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
14dc0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
14dd0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
14de0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
14df0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
14e00 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
14e10 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
14e20 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
14e30 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
14e40 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
14e50 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
14e60 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
14e70 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
14e80 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
14e90 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
14ea0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
14eb0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
14ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14ed0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
14ee0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
14ef0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14f00 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
14f10 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
14f20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
14f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14f40 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
14f50 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
14f60 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
14f70 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14f80 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20    Pgno nTrunc = 
14f90 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
14fa0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14fb0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
14fc0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
14fd0 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
14fe0 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e  umCommit(pBt, &n
14ff0 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69  Trunc); .      i
15000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
15020 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15030 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15050 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
15060 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
15070 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ster, nTrunc);. 
15080 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15090 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
150a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
150b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
150c0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
150d0 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
150e0 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
150f0 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
15100 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
15110 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ** sqlite3BtreeS
15120 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  ync() routine do
15130 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
15140 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  se and should be
15150 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f   invoked.** prio
15160 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
15170 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
15180 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
15190 28 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a  () routine did.*
151a0 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  * all the work o
151b0 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
151c0 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
151d0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
151e0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
151f0 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
15200 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
15210 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
15220 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
15230 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
15240 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
15250 61 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ate the rollback
15260 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69   journal.** (whi
15270 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
15280 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
15290 6d 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f  mit) and drop lo
152a0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
152b0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
152c0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
152d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
152e0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
152f0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
15300 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
15310 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
15320 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
15330 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
15340 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
15350 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15360 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
15370 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
15380 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15390 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
153a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
153b0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
153c0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
153d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
153e0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
153f0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
15400 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
15410 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
15420 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
15430 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
15440 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
15450 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15460 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
15470 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
15480 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
15490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
154a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
154b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
154c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
154d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
154e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
154f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15500 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
15510 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  D;.    pBt->inSt
15520 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e  mt = 0;.  }.  un
15530 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
15540 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
15550 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69  andle has any ki
15560 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
15570 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
15580 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
15590 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  n.  ** count of 
155a0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
155b0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
155c0 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68  tion count reach
155d0 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74  es 0, set.  ** t
155e0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
155f0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
15600 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
15610 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65  Unused() call be
15620 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e  low.  ** will un
15630 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
15640 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
15650 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
15660 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  E ){.    pBt->nT
15670 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
15680 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
15690 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
156a0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
156b0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
156c0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
156d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e    /* Set the han
156e0 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61  dles current tra
156f0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
15700 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
15710 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
15720 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
15730 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
15740 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
15750 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
15760 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   */.  p->inTrans
15770 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
15780 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
15790 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
157a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
157b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
157c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
157d0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
157e0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
157f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15800 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
15810 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
15820 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15830 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
15840 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
15870 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
15880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15890 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
158a0 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
158b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
158c0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
158d0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
158e0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
158f0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
15900 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
15910 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
15920 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
15930 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
15940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15950 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
15960 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
15970 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
15980 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
15990 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
159a0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
159b0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
159c0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
159d0 3e 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a  >wrFlag ) r++; .
159e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
159f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
15a00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
15a10 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
15a20 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
15a30 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e  * Print debuggin
15a40 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  g information ab
15a50 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  out all cursors 
15a60 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
15a70 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ut..*/.void sqli
15a80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69  te3BtreeCursorLi
15a90 73 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  st(Btree *p){.  
15aa0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
15ab0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15ac0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28  = p->pBt;.  for(
15ad0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
15ae0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
15af0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
15b00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
15b10 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
15b20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20    char *zMode = 
15b30 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22  pCur->wrFlag ? "
15b40 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20  rw" : "ro";.    
15b50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
15b60 74 66 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f  tf("CURSOR %p ro
15b70 6f 74 65 64 20 61 74 20 25 34 64 28 25 73 29 20  oted at %4d(%s) 
15b80 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e  currently at %d.
15b90 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %d%s\n",.       
15ba0 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  pCur, pCur->pgno
15bb0 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20  Root, zMode,.   
15bc0 20 20 20 20 70 50 61 67 65 20 3f 20 70 50 61 67      pPage ? pPag
15bd0 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75  e->pgno : 0, pCu
15be0 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28  r->idx,.       (
15bf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15c00 52 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22  RSOR_VALID) ? ""
15c10 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b   : " eof".    );
15c20 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
15c30 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
15c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
15c50 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
15c60 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
15c70 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
15c80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
15c90 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
15ca0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
15cb0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
15cc0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15cd0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
15ce0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
15cf0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
15d00 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
15d10 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
15d20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15d30 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
15d40 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
15d50 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
15d60 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
15d70 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
15d80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d90 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
15da0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
15db0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15dc0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
15dd0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72  ge *pPage1;..  r
15de0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
15df0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
15e00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15e10 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
15e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
15e40 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
15e50 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
15e60 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
15e70 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
15e80 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
15e90 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
15ea0 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
15eb0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
15ec0 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
15ed0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
15ee0 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
15ef0 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
15f00 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
15f10 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
15f20 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
15f30 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
15f40 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
15f50 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
15f60 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
15f70 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
15f80 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
15f90 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
15fa0 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
15fb0 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
15fc0 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
15fd0 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
15fe0 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
15ff0 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
16000 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
16010 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  pCursor ){.     
16020 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16030 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74  Bt->pCursor->pBt
16040 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20  ree->pSqlite;.  
16050 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20      if( db ){.  
16060 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f        sqlite3Abo
16070 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
16080 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
16090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
160a0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
160b0 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
160c0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
160d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
160e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
160f0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23  .    int rc2;..#
16100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16110 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16120 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
16130 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61  0;.#endif..    a
16140 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
16150 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
16160 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
16170 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
16180 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
16190 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
161a0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
161b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
161c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
161d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
161e0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
161f0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
16200 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
16210 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61 67 65 28  ** call getPage(
16220 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
16230 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70  n to make sure p
16240 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 0a  Page1->aData is.
16250 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72 72 65      ** set corre
16260 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
16270 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c   getPage(pBt, 1,
16280 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
16290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
162a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
162b0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
162c0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
162d0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
162e0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
162f0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
16300 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
16310 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
16320 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
16330 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
16340 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
16350 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
16360 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
16370 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
16380 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
16390 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
163a0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
163b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
163c0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
163d0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
163e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
163f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16400 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
16410 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72  ntegrity(p);.  r
16420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16430 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
16440 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
16450 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
16460 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
16470 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
16480 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
16490 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
164a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
164b0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
164c0 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
164d0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
164e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
164f0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
16500 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
16510 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
16520 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
16530 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
16540 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
16550 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
16560 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
16570 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
16580 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
16590 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
165a0 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
165b0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
165c0 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
165d0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
165e0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
165f0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
16600 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
16610 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
16620 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
16630 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
16640 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
16650 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
16660 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
16670 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
16680 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
16690 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
166a0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
166b0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
166c0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
166d0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
166e0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
166f0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
16700 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
16710 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
16720 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
16730 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
16740 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16750 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54  t;.  if( (p->inT
16760 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
16770 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d  E) || pBt->inStm
16780 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16790 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
167a0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
167b0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
167c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
167d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
167e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
167f0 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61  .  rc = pBt->rea
16800 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
16810 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72  K : sqlite3Pager
16820 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70  StmtBegin(pBt->p
16830 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69  Pager);.  pBt->i
16840 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74  nStmt = 1;.  ret
16850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16860 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61  * Commit the sta
16870 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  tment subtransac
16880 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
16890 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20  n progress.  If 
168a0 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63  no.** subtransac
168b0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
168c0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
168d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
168e0 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42  treeCommitStmt(B
168f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16900 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
16910 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16920 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
16930 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
16940 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
16950 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
16960 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
16970 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16990 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d    }.  pBt->inStm
169a0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
169b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
169c0 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65  lback the active
169d0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
169e0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e  ansaction.  If n
169f0 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  o subtransaction
16a00 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68  .** is active th
16a10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16a20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  no-op..**.** All
16a30 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
16a40 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
16a50 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
16a60 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20   Any attempt.** 
16a70 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20  to use a cursor 
16a80 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
16a90 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16aa0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
16ab0 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  .** will result 
16ac0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
16ad0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ae0 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72  RollbackStmt(Btr
16af0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16b20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
16b30 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28  3MallocDisallow(
16b40 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
16b50 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
16b60 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
16b70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
16b80 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  tmtRollback(pBt-
16b90 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  >pPager);.    as
16ba0 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
16bb0 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
16bc0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  );.    pBt->inSt
16bd0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  mt = 0;.  }.  sq
16be0 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77  lite3MallocAllow
16bf0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
16c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  .}../*.** Defaul
16c10 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e  t key comparison
16c20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
16c30 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61  used if no compa
16c40 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a  rison function.*
16c50 2a 20 69 73 20 73 70 65 63 69 66 69 65 64 20 6f  * is specified o
16c60 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  n the sqlite3Btr
16c70 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e  eeCursor() call.
16c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
16c90 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  fltCompare(.  vo
16ca0 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  id *NotUsed,    
16cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
16cc0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73 65   data is not use
16cd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63  d */.  int n1, c
16ce0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 20  onst void *p1,  
16cf0 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74    /* First key t
16d00 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
16d10 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nt n2, const voi
16d20 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65 63  d *p2     /* Sec
16d30 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61  ond key to compa
16d40 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  re */.){.  int c
16d50 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  ;.  c = memcmp(p
16d60 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e  1, p2, n1<n2 ? n
16d70 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20 63  1 : n2);.  if( c
16d80 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e  ==0 ){.    c = n
16d90 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65  1 - n2;.  }.  re
16da0 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
16db0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
16dc0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
16dd0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
16de0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
16df0 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74  iTable.  The act
16e00 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20   of acquiring a 
16e10 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65  cursor gets a re
16e20 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  ad lock on .** t
16e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16e40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
16e50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
16e60 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
16e70 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
16e80 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
16e90 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
16ea0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
16eb0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
16ec0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
16ed0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
16ee0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
16ef0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
16f00 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
16f10 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
16f20 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
16f30 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
16f40 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
16f50 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
16f60 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
16f70 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
16f80 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
16f90 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
16fa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
16fb0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
16fc0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
16fd0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
16fe0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
16ff0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
17000 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
17010 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
17020 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
17030 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
17040 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
17050 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
17060 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
17070 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
17080 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
17090 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
170a0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
170b0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
170c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
170d0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
170e0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
170f0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
17100 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
17110 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
17120 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
17130 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
17140 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
17150 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
17160 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
17170 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
17180 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
17190 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
171a0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
171b0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
171c0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
171d0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
171e0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tly..**.** The c
171f0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
17200 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69 63  on must be logic
17210 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 6f  ally the same fo
17220 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a 2a  r every cursor.*
17230 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  * on a particula
17240 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67 69  r table.  Changi
17250 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
17260 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  n function will 
17270 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63  result.** in inc
17280 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
17290 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70 61  s.  If the compa
172a0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
172b0 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66  s NULL, a.** def
172c0 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ault comparison 
172d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
172e0 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  .  The compariso
172f0 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  n function is.**
17300 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20   always ignored 
17310 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  for INTKEY table
17320 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
17330 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
17340 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17370 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
17380 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
173b0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
173c0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
173d0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
17400 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
17410 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  nly */.  int (*x
17420 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  Cmp)(void*,int,c
17430 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
17440 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20  onst void*), /* 
17450 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66  Key Comparison f
17460 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  unc */.  void *p
17470 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
174a0 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
174b0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a  */.  BtCursor **
174c0 70 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  ppCur           
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
174f0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
17500 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
17510 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74  rsor *pCur;.  Bt
17520 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17530 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72 20  >pBt;..  *ppCur 
17540 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  = 0;.  if( wrFla
17550 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  g ){.    if( pBt
17560 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
17570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17580 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
17590 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
175a0 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
175b0 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  le, 0) ){.      
175c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
175d0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  CKED;.    }.  }.
175e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
175f0 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  e1==0 ){.    rc 
17600 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  = lockBtreeWithR
17610 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28  etry(p);.    if(
17620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17630 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17640 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
17650 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
17660 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  & wrFlag ){.    
17670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17680 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
17690 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
176a0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
176b0 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66  f(*pCur) );.  if
176c0 28 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20  ( pCur==0 ){.   
176d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
176e0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  EM;.    goto cre
176f0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
17700 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72  tion;.  }.  pCur
17710 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
17720 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28  no)iTable;.  if(
17730 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71   iTable==1 && sq
17740 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
17750 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
17760 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
17770 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
17780 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
17790 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
177a0 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
177b0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
177c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
177d0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b  pCur->pPage, 0);
177e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
177f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
17800 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
17810 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  xception;.  }.. 
17820 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
17830 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
17840 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
17850 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
17860 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
17870 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20  ables, link the 
17880 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
17890 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e  BtShared list an
178a0 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68  d set *ppCur (th
178b0 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72  e.  ** output ar
178c0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
178d0 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20  unction)..  */. 
178e0 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20   pCur->xCompare 
178f0 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20  = xCmp ? xCmp : 
17900 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70  dfltCompare;.  p
17910 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67  Cur->pArg = pArg
17920 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
17930 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72   = p;.  pCur->wr
17940 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20  Flag = wrFlag;. 
17950 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
17960 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
17970 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
17980 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
17990 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
179a0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
179b0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
179c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
179d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a  SOR_INVALID;.  *
179e0 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20  ppCur = pCur;.. 
179f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17a00 4b 3b 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  K;.create_cursor
17a10 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66  _exception:.  if
17a20 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65  ( pCur ){.    re
17a30 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
17a40 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  pPage);.    sqli
17a50 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20  teFree(pCur);.  
17a60 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
17a70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
17a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17a90 66 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64  f 0  /* Not Used
17aa0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65   */./*.** Change
17ab0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17ac0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
17ad0 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20  ction used by a 
17ae0 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
17af0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
17b00 6f 6d 70 61 72 65 28 0a 20 20 42 74 43 75 72 73  ompare(.  BtCurs
17b10 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
17b20 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77   The cursor to w
17b30 68 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  hose comparison 
17b40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e  function is chan
17b50 67 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  ged */.  int(*xC
17b60 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
17b70 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
17b80 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e  nst void*), /* N
17b90 65 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ew comparison fu
17ba0 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
17bb0 72 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  rg          /* F
17bc0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
17bd0 20 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20   xCmp() */.){.  
17be0 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  pCur->xCompare =
17bf0 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64   xCmp ? xCmp : d
17c00 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  fltCompare;.  pC
17c10 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b  ur->pArg = pArg;
17c20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17c30 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
17c40 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
17c50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17c60 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
17c70 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
17c80 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
17c90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17ca0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
17cb0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
17cc0 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
17cd0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
17ce0 65 65 2d 3e 70 42 74 3b 0a 20 20 63 6c 65 61 72  ee->pBt;.  clear
17cf0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
17d00 43 75 72 29 3b 0a 20 20 69 66 28 20 70 43 75 72  Cur);.  if( pCur
17d10 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
17d20 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
17d30 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
17d40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
17d50 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
17d60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  r->pNext;.  }.  
17d70 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
17d80 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
17d90 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
17da0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72  ->pPrev;.  }.  r
17db0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
17dc0 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63  >pPage);.  unloc
17dd0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17de0 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Bt);.  sqliteFre
17df0 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
17e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17e10 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d  /*.** Make a tem
17e20 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79  porary cursor by
17e30 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
17e40 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43  fields of pTempC
17e50 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f  ur..** The tempo
17e60 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e  rary cursor is n
17e70 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ot on the cursor
17e80 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74   list for the Bt
17e90 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ree..*/.static v
17ea0 6f 69 64 20 67 65 74 54 65 6d 70 43 75 72 73 6f  oid getTempCurso
17eb0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
17ec0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
17ed0 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79 28  pCur){.  memcpy(
17ee0 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
17ef0 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
17f00 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
17f10 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
17f20 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
17f30 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  if( pTempCur->pP
17f40 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
17f50 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70  e3PagerRef(pTemp
17f60 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50  Cur->pPage->pDbP
17f70 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
17f80 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70  ** Delete a temp
17f90 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63  orary cursor suc
17fa0 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79  h as was made by
17fb0 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f   the CreateTempo
17fc0 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20  raryCursor().** 
17fd0 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a  function above..
17fe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
17ff0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
18000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
18010 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  {.  if( pCur->pP
18020 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
18030 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
18040 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
18050 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
18060 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
18070 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 66 69 65  tCursor.info fie
18080 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ld of the given 
18090 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
180a0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
180b0 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
180c0 63 61 6c 6c 20 70 61 72 73 65 43 65 6c 6c 28 29  call parseCell()
180d0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
180e0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
180f0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
18100 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
18110 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
18120 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
18130 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
18140 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
18150 20 63 61 6c 6c 73 20 74 6f 20 70 61 72 73 65 43   calls to parseC
18160 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ell()..*/.static
18170 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
18180 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
18190 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
181a0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
181b0 20 20 20 20 70 61 72 73 65 43 65 6c 6c 28 70 43      parseCell(pC
181c0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
181d0 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66  >idx, &pCur->inf
181e0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  o);.  }else{.#if
181f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
18200 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
18210 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
18220 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
18230 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c  );.    parseCell
18240 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
18250 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b  ur->idx, &info);
18260 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
18270 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
18280 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
18290 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  nfo))==0 );.#end
182a0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
182b0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
182c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
182d0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
182e0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
182f0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
18300 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
18310 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
18320 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
18330 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
18340 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
18350 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
18360 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
18370 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
18380 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
18390 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
183a0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
183b0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
183c0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
183d0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
183e0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
183f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
18400 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
18410 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72  t rc = restoreOr
18420 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
18430 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
18440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18450 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18460 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18470 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
18480 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18490 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
184a0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
184b0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
184c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
184d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
184e0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
184f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
18500 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
18510 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
18520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
18540 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
18550 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
18560 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
18570 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
18580 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
18590 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
185a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
185b0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
185c0 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
185d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
185e0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
185f0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
18600 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
18610 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
18620 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
18630 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
18640 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
18650 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
18660 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
18670 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
18680 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
18690 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74  .  int rc = rest
186a0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
186b0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
186c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
186d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
186e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
186f0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
18700 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
18710 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18720 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
18730 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
18740 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
18750 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
18760 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
18770 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
18780 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
18790 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
187a0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
187b0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
187c0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
187d0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
187e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
187f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
18800 64 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  d payload inform
18810 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
18820 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
18830 75 72 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  ur cursor is.** 
18840 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 42 65  pointing to.  Be
18850 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 65 20  gin reading the 
18860 70 61 79 6c 6f 61 64 20 61 74 20 22 6f 66 66 73  payload at "offs
18870 65 74 22 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  et" and read.** 
18880 61 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  a total of "amt"
18890 20 62 79 74 65 73 2e 20 20 50 75 74 20 74 68 65   bytes.  Put the
188a0 20 72 65 73 75 6c 74 20 69 6e 20 7a 42 75 66 2e   result in zBuf.
188b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
188c0 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ine does not mak
188d0 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20  e a distinction 
188e0 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20  between key and 
188f0 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74  data..** It just
18900 20 72 65 61 64 73 20 62 79 74 65 73 20 66 72 6f   reads bytes fro
18910 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
18920 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
18930 61 70 70 65 61 72 0a 2a 2a 20 6f 6e 20 74 68 65  appear.** on the
18940 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65   main page or be
18950 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
18960 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
18970 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74  low pages..*/.st
18980 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 79 6c  atic int getPayl
18990 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
189a0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
189b0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
189c0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
189d0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  from */.  int of
189e0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
189f0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
18a00 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
18a10 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61  yload */.  int a
18a20 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
18a30 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
18a40 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
18a50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
18a60 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
18a70 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
18a80 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
18a90 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
18aa0 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e   /* offset begin
18ab0 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  s at data if thi
18ac0 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
18ad0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
18ae0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 50 67 6e  *aPayload;.  Pgn
18af0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 69 6e  o nextPage;.  in
18b00 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
18b10 2a 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  *pPage;.  BtShar
18b20 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6f  ed *pBt;.  int o
18b30 76 66 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e  vflSize;.  u32 n
18b40 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Key;..  assert( 
18b50 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
18b60 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
18b70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
18b80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18b90 44 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 43 75  D );.  pBt = pCu
18ba0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
18bb0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
18bc0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
18bd0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18be0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
18bf0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74  ->nCell );.  get
18c00 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
18c10 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
18c20 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
18c30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
18c40 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
18c50 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
18c60 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
18c70 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
18c80 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
18c90 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
18ca0 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  et>=0 );.  if( s
18cb0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66  kipKey ){.    of
18cc0 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  fset += nKey;.  
18cd0 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  }.  if( offset+a
18ce0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
18cf0 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20  info.nData ){.  
18d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18d20 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
18d30 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
18d40 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
18d50 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
18d60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18d70 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
18d80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
18d90 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
18da0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
18db0 20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65   &aPayload[offse
18dc0 74 5d 2c 20 61 29 3b 0a 20 20 20 20 69 66 28 20  t], a);.    if( 
18dd0 61 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 20 20  a==amt ){.      
18de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 66 66 73  ;.    }.    offs
18e00 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
18e10 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
18e20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
18e30 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
18e40 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
18e50 20 7d 0a 20 20 6f 76 66 6c 53 69 7a 65 20 3d 20   }.  ovflSize = 
18e60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18e70 2d 20 34 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30  - 4;.  if( amt>0
18e80 20 29 7b 0a 20 20 20 20 6e 65 78 74 50 61 67 65   ){.    nextPage
18e90 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
18ea0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
18eb0 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 20 20 20 20 77  .nLocal]);.    w
18ec0 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 6e  hile( amt>0 && n
18ed0 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
18ee0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
18ef0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18f00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
18f10 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
18f20 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
18f30 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
18f40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18f50 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
18f60 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
18f70 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
18f80 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
18f90 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
18fa0 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
18fb0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
18fc0 74 3c 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  t<ovflSize ){.  
18fd0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
18fe0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
18ff0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
19000 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19010 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
19020 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
19030 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
19040 79 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61  y(pBuf, &aPayloa
19050 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 61 29 3b  d[offset+4], a);
19060 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
19070 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 6d 74  = 0;.        amt
19080 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
19090 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
190a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f  }else{.        o
190b0 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
190c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
190d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
190e0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
190f0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 6d   }.  }..  if( am
19100 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
19110 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19120 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
19130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19140 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
19150 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
19160 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
19170 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
19180 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
19190 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
191a0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
191b0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
191c0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
191d0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
191e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
191f0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
19200 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
19210 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
19220 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
19230 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
19240 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
19250 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
19260 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
19270 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
19280 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
19290 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
192a0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
192b0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
192c0 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
192d0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
192e0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
192f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19300 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19310 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19320 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
19330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
19340 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
19350 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
19360 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
19370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19380 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19390 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
193a0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
193b0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
193c0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
193d0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
193e0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
193f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
19400 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
19410 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
19420 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
19430 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
19440 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19450 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
19460 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
19470 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
19480 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
19490 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
194a0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
194b0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
194c0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
194d0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
194e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
194f0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
19500 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
19510 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
19520 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
19530 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19540 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
19550 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
19560 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
19570 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
19580 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
19590 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
195a0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
195b0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
195c0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Buf){.  int rc =
195d0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
195e0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
195f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
19600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19610 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19620 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19630 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
19640 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  ( pCur->pPage!=0
19650 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19660 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
19670 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
19680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
19690 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 79 6c      rc = getPayl
196a0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
196b0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 29 3b  , amt, pBuf, 1);
196c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
196d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
196e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
196f0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
19700 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
19710 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
19720 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
19730 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
19740 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
19750 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
19760 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
19770 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
19780 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
19790 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
197a0 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
197b0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
197c0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
197d0 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
197e0 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
197f0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
19800 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
19810 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
19820 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
19830 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
19840 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19850 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
19860 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
19870 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
19880 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
19890 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
198a0 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
198b0 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
198c0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
198d0 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
198e0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
198f0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
19900 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
19910 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
19920 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
19930 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
19940 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
19950 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
19960 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 67  ow pages, then g
19970 65 74 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  etPayload() must
19980 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
19990 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65  sembly.** the ke
199a0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
199b0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
199c0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
199d0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
199e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
199f0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
19a00 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
19a10 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
19a20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19a30 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
19a40 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
19a50 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
19a60 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
19a70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
19a80 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
19a90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
19aa0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
19ab0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
19ac0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
19ad0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
19ae0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
19af0 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
19b00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
19b10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
19b20 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
19b30 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
19b40 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
19b50 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
19b60 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
19b70 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
19b80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
19b90 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
19ba0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
19bb0 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  Key;.  int nLoca
19bc0 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
19bd0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ur!=0 && pCur->p
19be0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
19bf0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19c00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19c10 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
19c20 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
19c30 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
19c40 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
19c50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
19c60 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
19c70 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
19c80 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
19c90 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
19ca0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
19cb0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
19cc0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
19cd0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
19ce0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
19cf0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
19d00 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
19d10 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
19d20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
19d30 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19d40 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
19d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
19d60 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19d70 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
19d80 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
19d90 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
19da0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
19db0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
19dc0 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
19dd0 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
19de0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
19df0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
19e00 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
19e10 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
19e20 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
19e30 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
19e40 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
19e50 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
19e60 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
19e70 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
19e80 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
19e90 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
19ea0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
19eb0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
19ec0 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
19ed0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
19ee0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
19ef0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
19f00 74 72 65 65 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  tree routine..**
19f10 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
19f20 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
19f30 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
19f40 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
19f50 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
19f60 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
19f70 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
19f80 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
19f90 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
19fa0 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
19fb0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
19fc0 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75  pAmt){.  if( pCu
19fd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19fe0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
19ff0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1a000 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1a010 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1a020 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a030 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1a040 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1a050 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1a060 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1a070 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a080 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a090 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1a0a0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1a0b0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1a0c0 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
1a0d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
1a0e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a0f0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
1a100 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
1a110 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
1a120 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
1a130 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a140 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
1a150 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve to..*/.static
1a160 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1a170 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1a180 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1a190 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1a1a0 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1a1b0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67  MemPage *pOldPag
1a1c0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1a1d0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
1a1e0 65 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  e->pBt;..  asser
1a1f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1a200 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1a210 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
1a220 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
1a230 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20  gno, &pNewPage, 
1a240 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
1a250 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a260 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e  rc;.  pNewPage->
1a270 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72  idxParent = pCur
1a280 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67  ->idx;.  pOldPag
1a290 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1a2a0 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78  .  pOldPage->idx
1a2b0 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c  Shift = 0;.  rel
1a2c0 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67  easePage(pOldPag
1a2d0 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
1a2e0 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  e = pNewPage;.  
1a2f0 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20  pCur->idx = 0;. 
1a300 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a310 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  e = 0;.  if( pNe
1a320 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29  wPage->nCell<1 )
1a330 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a340 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1a360 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a370 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1a380 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68  f the page is th
1a390 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
1a3a0 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f its table..**.
1a3b0 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 72  ** The virtual r
1a3c0 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20  oot page is the 
1a3d0 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f  root page for mo
1a3e0 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a  st tables.  But.
1a3f0 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
1a400 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20   rooted on page 
1a410 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20  1, sometime the 
1a420 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a  real root page.*
1a430 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70  * is empty excep
1a440 74 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  t for the right-
1a450 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63  pointer.  In suc
1a460 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76  h cases the.** v
1a470 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
1a480 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
1a490 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  t the right-poin
1a4a0 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31  ter of page.** 1
1a4b0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
1a4c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1a4d0 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67  sRootPage(MemPag
1a4e0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
1a4f0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20  Page *pParent = 
1a500 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
1a510 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30    if( pParent==0
1a520 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1a530 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  f( pParent->pgno
1a540 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  >1 ) return 0;. 
1a550 20 69 66 28 20 67 65 74 32 62 79 74 65 28 26 70   if( get2byte(&p
1a560 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
1a570 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
1a580 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  +3])==0 ) return
1a590 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
1a5a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a5b0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
1a5c0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
1a5d0 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
1a5e0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
1a5f0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
1a600 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
1a610 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
1a620 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
1a630 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
1a640 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
1a650 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
1a660 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
1a670 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1a680 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1a690 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
1a6a0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
1a6b0 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
1a6c0 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
1a6d0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
1a6e0 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d  ge *pParent;.  M
1a6f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
1a700 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b 0a   int idxParent;.
1a710 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a720 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a730 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65  VALID );.  pPage
1a740 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1a750 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
1a760 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a770 21 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  !isRootPage(pPag
1a780 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20  e) );.  pParent 
1a790 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
1a7a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1a7b0 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78 50  ent!=0 );.  idxP
1a7c0 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69  arent = pPage->i
1a7d0 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69  dxParent;.  sqli
1a7e0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
1a7f0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
1a800 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1a810 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
1a820 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  ge = pParent;.  
1a830 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a840 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1a850 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66  pParent->idxShif
1a860 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  t==0 );.  pCur->
1a870 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b  idx = idxParent;
1a880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1a890 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1a8a0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74   root page.*/.st
1a8b0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1a8c0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
1a8d0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1a8e0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
1a8f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
1a900 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1a910 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
1a920 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
1a930 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45  State==CURSOR_RE
1a940 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
1a950 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
1a960 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a  tion(pCur);.  }.
1a970 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
1a980 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f  pPage;.  if( pRo
1a990 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e  ot && pRoot->pgn
1a9a0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1a9b0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
1a9c0 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29   pRoot->isInit )
1a9d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a9e0 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  f( .      SQLITE
1a9f0 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e  _OK!=(rc = getAn
1aa00 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
1aa10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
1aa20 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29  pRoot, 0)).    )
1aa30 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
1aa40 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1aa50 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
1aa60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1aa70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1aa80 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
1aa90 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52  pCur->pPage = pR
1aaa0 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  oot;.  }.  pCur-
1aab0 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
1aac0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1aad0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
1aae0 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1aaf0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1ab00 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1ab10 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1ab20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
1ab30 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
1ab40 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
1ab50 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
1ab60 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
1ab70 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
1ab80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1ab90 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
1aba0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1abb0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
1abc0 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ge);.  }.  pCur-
1abd0 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72  >eState = ((pCur
1abe0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1abf0 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
1ac00 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
1ac10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ac20 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1ac30 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1ac40 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1ac50 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1ac60 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
1ac70 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1ac80 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
1ac90 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
1aca0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
1acb0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
1acc0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
1acd0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
1ace0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1acf0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1ad00 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
1ad10 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1ad20 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b   pgno;.  int rc;
1ad30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1ad40 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  e;..  assert( pC
1ad50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ad60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1ad70 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70  ile( !(pPage = p
1ad80 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1ad90 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1ada0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1adb0 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1adc0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1add0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1ade0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1adf0 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1ae00 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1ae10 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1ae20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1ae30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
1ae40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ae50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1ae60 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1ae70 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1ae80 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1ae90 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1aea0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1aeb0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1aec0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1aed0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1aee0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1aef0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1af00 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1af10 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1af20 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1af30 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1af40 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1af50 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1af60 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1af70 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1af80 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1af90 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1afa0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1afb0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1afc0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1afd0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1afe0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1aff0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1b000 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1b010 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1b020 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1b030 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pgno;.  int rc;.
1b040 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
1b060 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b070 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1b080 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
1b090 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1b0a0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1b0b0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b0c0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b0d0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1b0e0 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
1b0f0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
1b100 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1b110 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1b120 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1b130 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1b140 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
1b150 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ll - 1;.  pCur->
1b160 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1b170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b180 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
1b190 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1b1a0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1b1b0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1b1c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1b1d0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1b1e0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1b1f0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1b200 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1b210 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1b220 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1b230 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b240 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1b250 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1b260 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b270 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b280 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1b290 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1b2a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1b2b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1b2c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1b2d0 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
1b2e0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1b2f0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b300 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1b310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b320 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b330 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1b340 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  l>0 );.  *pRes =
1b350 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   0;.  rc = moveT
1b360 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1b370 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b380 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1b390 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
1b3a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1b3b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1b3c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1b3d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1b3e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1b3f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1b400 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1b410 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1b420 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1b430 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1b440 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
1b450 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
1b460 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1b470 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
1b480 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1b490 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1b4a0 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 43  turn rc;.  if( C
1b4b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1b4c0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1b4d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b4e0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
1b4f0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
1b500 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1b510 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1b520 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1b530 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1b540 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
1b550 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1b560 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
1b570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b580 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1b590 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1b5a0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1b5b0 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b 65 79 2e   near pKey/nKey.
1b5c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 75 63  .** Return a suc
1b5d0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
1b5e0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
1b5f0 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  es, only the nKe
1b600 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1b610 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
1b620 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 6f   ignored.  For o
1b630 74 68 65 72 20 74 61 62 6c 65 73 2c 20 6e 4b 65  ther tables, nKe
1b640 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  y is the number 
1b650 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1b660 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20 20 54 68  .** in pKey.  Th
1b670 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
1b680 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
1b690 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  when the cursor 
1b6a0 77 61 73 0a 2a 2a 20 63 72 65 61 74 65 64 20 69  was.** created i
1b6b0 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
1b6c0 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  e keys..**.** If
1b6d0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
1b6e0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
1b6f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1b700 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
1b710 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
1b720 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
1b730 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
1b740 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
1b750 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
1b760 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
1b770 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
1b780 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
1b790 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
1b7a0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  key..**.** The r
1b7b0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1b7c0 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
1b7d0 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
1b7e0 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ch the.** cursor
1b7f0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
1b800 70 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55  pRes if pRes!=NU
1b810 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  LL.  The meaning
1b820 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75   of.** this valu
1b830 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
1b840 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1b850 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1b860 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1b870 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1b880 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1b890 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1b8a0 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72  ler than pKey or
1b8b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1b8c0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
1b8d0 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
1b8e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
1b8f0 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
1b900 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
1b910 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
1b920 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b930 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b940 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b950 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b960 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
1b970 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a  tches pKey..**.*
1b980 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
1b990 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1b9a0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1b9b0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1b9c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b9d0 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
1b9e0 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  an pKey..*/.int 
1b9f0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1ba00 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1ba10 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  pCur,        /* 
1ba20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1ba30 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   moved */.  cons
1ba40 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1ba50 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f     /* The key co
1ba60 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65  ntent for indice
1ba70 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20  s.  Not used by 
1ba80 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36 34 20  tables */.  i64 
1ba90 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1baa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b     /* Size of pK
1bab0 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20  ey.  Or the key 
1bac0 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  for tables */.  
1bad0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
1bae0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1baf0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
1bb00 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1bb10 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1bb20 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s              /
1bb30 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20  * Search result 
1bb40 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  flag */.){.  int
1bb50 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
1bb60 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1bb70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1bb80 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rc;.  assert( pC
1bb90 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
1bba0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1bbb0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1bbc0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1bbd0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bbe0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1bbf0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1bc00 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1bc10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1bc20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bc30 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20   }.  for(;;){.  
1bc40 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1bc50 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1bc60 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1bc70 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1bc80 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d  e;.    int c = -
1bc90 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75  1;  /* pRes retu
1bca0 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65  rn if table is e
1bcb0 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20  mpty must be -1 
1bcc0 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  */.    lwr = 0;.
1bcd0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
1bce0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
1bcf0 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
1bd00 20 26 26 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20   && pKey==0 ){. 
1bd10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bd20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bd30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1bd40 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1bd50 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75 70    pCur->idx = up
1bd60 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1bd70 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1bd80 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20  (upr+lwr)/2;.   
1bd90 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c 3d   }.    if( lwr<=
1bda0 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20  upr ) for(;;){. 
1bdb0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
1bdc0 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  Key;.      i64 n
1bdd0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70  CellKey;.      p
1bde0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1bdf0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1be00 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1be10 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c          u8 *pCel
1be20 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
1be30 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1be40 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 2b 20  e, pCur->idx) + 
1be50 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
1be60 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
1be70 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
1be80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
1be90 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
1bea0 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
1beb0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 26 64  rint32(pCell, &d
1bec0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
1bed0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
1bee0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 20 2a  nt(pCell, (u64 *
1bef0 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1bf00 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1bf10 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  y<nKey ){.      
1bf20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
1bf30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
1bf40 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 7b 0a 20  ellKey>nKey ){. 
1bf50 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
1bf60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1bf70 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1bf80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bf90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bfa0 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20  int available;. 
1bfb0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1bfc0 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50  = (void *)fetchP
1bfd0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76  ayload(pCur, &av
1bfe0 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  ailable, 0);.   
1bff0 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20       nCellKey = 
1c000 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1c010 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61  .        if( ava
1c020 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79  ilable>=nCellKey
1c030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1c040 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65  = pCur->xCompare
1c050 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65  (pCur->pArg, nCe
1c060 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1c070 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20   nKey, pKey);.  
1c080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c090 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1c0a0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1c0b0 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20  w( nCellKey );. 
1c0c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1c0d0 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  llKey==0 ) retur
1c0e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1c0f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1c100 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1c110 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
1c120 2c 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b  , (void *)pCellK
1c130 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1c140 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72   = pCur->xCompar
1c150 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20 6e 43  e(pCur->pArg, nC
1c160 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1c170 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  , nKey, pKey);. 
1c180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
1c190 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
1c1a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1c1b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c1d0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
1c1e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1c1f0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
1c200 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c210 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
1c220 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20  pCur->idx;.     
1c230 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d       upr = lwr -
1c240 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
1c250 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1c260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
1c270 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1c280 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1c290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c2a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2b0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
1c2c0 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
1c2d0 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20   pCur->idx+1;.  
1c2e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c2f0 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69     upr = pCur->i
1c300 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1c310 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1c320 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1c330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c340 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72  pCur->idx = (lwr
1c350 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +upr)/2;.    }. 
1c360 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
1c370 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
1c380 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1c390 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
1c3a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1c3b0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
1c3c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
1c3d0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1c3e0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1c3f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1c400 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1c410 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1c420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1c430 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1c440 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1c450 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
1c460 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
1c470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c480 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1c490 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
1c4a0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
1c4b0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1c4c0 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1c4d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c4e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1c4f0 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a  Cur->idx = lwr;.
1c500 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1c510 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Size = 0;.    rc
1c520 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1c530 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1c540 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1c550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c560 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20   }.  }.  /* NOT 
1c570 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a  REACHED */.}../*
1c580 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1c590 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1c5a0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1c5b0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1c5c0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1c5d0 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1c5e0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1c5f0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1c600 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1c610 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1c620 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1c630 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1c640 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1c650 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1c660 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1c670 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1c680 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1c690 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1c6a0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1c6b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1c6c0 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1c6d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1c6e0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1c6f0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1c700 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1c710 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1c720 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1c730 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1c740 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1c750 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1c760 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1c770 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1c780 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1c790 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1c7a0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1c7b0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
1c7c0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
1c7d0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
1c7e0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1c7f0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1c800 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1c810 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1c820 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1c830 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
1c840 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1c850 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1c860 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1c870 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1c880 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1c890 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c8a0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
1c8b0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1c8c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1c8d0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1c8e0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
1c8f0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
1c900 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1c910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c920 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c930 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
1c940 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  s!=0 );.  pPage 
1c950 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1c960 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1c970 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1c980 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1c990 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1c9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c9b0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
1c9c0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1c9d0 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1c9e0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1c9f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ca00 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1ca10 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
1ca20 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1ca30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ca40 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
1ca50 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b  );..  pCur->idx+
1ca60 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  +;.  pCur->info.
1ca70 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
1ca80 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67   pCur->idx>=pPag
1ca90 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1caa0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1cab0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
1cac0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1cad0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1cae0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1caf0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
1cb00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1cb10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
1cb20 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1cb30 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1cb40 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1cb50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cb60 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
1cb70 69 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70  if( isRootPage(p
1cb80 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Page) ){.       
1cb90 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1cba0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1cbb0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1cbc0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
1cbd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1cbe0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
1cbf0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
1cc00 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
1cc10 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
1cc20 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e  hile( pCur->idx>
1cc30 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
1cc40 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1cc50 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1cc60 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
1cc70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1cc80 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
1cc90 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1cca0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ccb0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
1ccc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1ccd0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
1cce0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1ccf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cd00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
1cd10 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1cd20 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1cd30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  rc;.}../*.** Ste
1cd40 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
1cd50 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
1cd60 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
1cd70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1cd80 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1cd90 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1cda0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1cdb0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1cdc0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1cdd0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1cde0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1cdf0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1ce00 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1ce10 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1ce20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1ce30 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
1ce40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1ce50 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1ce60 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
1ce70 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1ce80 67 65 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74  ge;..  rc = rest
1ce90 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
1cea0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1ceb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1ced0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1cee0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1cef0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1cf00 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1cf10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cf20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1cf30 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
1cf40 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1cf50 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1cf60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1cf70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1cf80 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
1cf90 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1cfa0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1cfb0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1cfc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1cfd0 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28  >idx>=0 );.  if(
1cfe0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1cff0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1d000 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70  byte( findCell(p
1d010 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1d020 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   );.    rc = mov
1d030 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1d040 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1d050 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d060 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1d070 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1d080 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1d090 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29  ( pCur->idx==0 )
1d0a0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 6f  {.      if( isRo
1d0b0 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
1d0c0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1d0d0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1d0e0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1d0f0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1d100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d110 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1d120 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
1d130 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
1d140 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1d150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
1d160 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75  ->idx--;.    pCu
1d170 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1d180 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1d190 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1d1a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d1c0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1d1d0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1d1e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d1f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d200 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1d210 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1d220 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1d230 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1d240 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1d250 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1d260 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1d270 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1d280 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1d290 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d2a0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1d2b0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1d2c0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1d2d0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1d2e0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1d2f0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1d300 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1d310 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1d320 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1d330 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d340 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1d350 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1d360 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1d370 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1d380 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1d390 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1d3a0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1d3b0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1d3c0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1d3d0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1d3e0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1d3f0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1d400 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1d410 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1d420 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1d430 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1d440 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1d450 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1d460 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1d470 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1d480 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1d490 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1d4a0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1d4b0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1d4c0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1d4d0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1d4e0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1d4f0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1d500 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1d510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d520 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1d530 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1d540 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1d550 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1d560 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1d570 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1d580 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1d590 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1d5a0 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1d5b0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1d5c0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1d5d0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1d5e0 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1d5f0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1d600 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1d610 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1d620 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1d630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d640 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d650 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1d660 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1d670 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1d680 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1d690 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1d6a0 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1d6b0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1d6c0 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1d6d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d6e0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1d6f0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1d700 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d710 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1d720 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1d730 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1d740 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1d750 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1d760 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  unk = 0;..  pPag
1d770 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1d780 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1d790 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d7a0 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1d7b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1d7c0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1d7d0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1d7e0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1d7f0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1d800 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1d810 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1d820 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1d830 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1d840 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1d850 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1d860 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1d870 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1d880 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1d890 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1d8a0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1d8b0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1d8c0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1d8d0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1d8e0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1d8f0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1d900 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1d910 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1d920 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1d930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d940 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1d950 65 78 61 63 74 20 29 7b 0a 20 20 20 20 20 20 75  exact ){.      u
1d960 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
1d970 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
1d980 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d990 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1d9a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
1d9b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
1d9c0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
1d9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1d9e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d9f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1da00 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1da10 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1da20 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
1da30 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
1da40 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
1da50 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
1da60 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
1da70 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
1da80 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
1da90 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
1daa0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
1dab0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
1dac0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
1dad0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
1dae0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1daf0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1db00 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1db10 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1db20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
1db30 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1db40 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
1db50 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
1db60 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
1db70 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
1db80 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
1db90 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
1dba0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
1dbb0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
1dbc0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
1dbd0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
1dbe0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
1dbf0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
1dc00 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
1dc10 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
1dc20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
1dc30 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
1dc40 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
1dc50 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
1dc60 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1dc70 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
1dc80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
1dc90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1dca0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
1dcb0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1dcc0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
1dcd0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1dce0 67 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  getPage(pBt, iTr
1dcf0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
1dd00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1dd10 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
1dd20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1dd30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1dd40 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
1dd50 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
1dd60 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1dd70 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
1dd80 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
1dd90 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
1dda0 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
1ddb0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
1ddc0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
1ddd0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
1dde0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
1ddf0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
1de00 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
1de10 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
1de20 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
1de30 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
1de40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1de50 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
1de60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1de70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1de80 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1de90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1dea0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1deb0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1dec0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1ded0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
1dee0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
1def0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1df00 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1df10 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1df20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
1df30 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1df40 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1df50 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1df60 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1df70 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1df80 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1df90 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
1dfa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70     }else if( k>p
1dfb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
1dfc0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 20 20   - 8 ){.        
1dfd0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
1dfe0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
1dff0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1e000 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
1e010 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1e020 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1e030 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e040 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
1e050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e060 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
1e070 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
1e080 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
1e090 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1e0a0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
1e0b0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
1e0c0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
1e0d0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
1e0e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
1e0f0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
1e100 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
1e110 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
1e120 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
1e130 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
1e140 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
1e150 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
1e160 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
1e170 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1e180 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e190 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1e1a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e1b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1e1c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e1d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1e1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e1f0 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
1e200 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1e210 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1e220 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1e230 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1e240 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e250 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1e260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e270 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
1e280 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1e290 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1e2a0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1e2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e2c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1e2d0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
1e2e0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
1e2f0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
1e300 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
1e310 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
1e320 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
1e330 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
1e340 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
1e350 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
1e360 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
1e370 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
1e380 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
1e390 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
1e3a0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
1e3b0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
1e3c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1e3d0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
1e3e0 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
1e3f0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
1e400 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
1e410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e430 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1e440 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e450 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1e460 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e470 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e480 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
1e490 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1e4a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e4c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1e4d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1e4e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1e4f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1e500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e510 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1e520 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
1e530 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1e540 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1e550 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
1e560 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
1e570 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
1e580 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1e590 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
1e5a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
1e5b0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
1e5c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e5d0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1e5e0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1e5f0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e600 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e610 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e620 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
1e630 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e640 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e660 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
1e670 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e680 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1e6a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1e6b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
1e6c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
1e6d0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
1e6e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
1e6f0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1e700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e710 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1e720 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1e730 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1e740 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1e750 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1e760 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
1e770 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
1e780 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  e{.        /* Ex
1e790 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
1e7a0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
1e7b0 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65         int close
1e7c0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
1e7d0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1e7e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1e7f0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
1e800 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
1e810 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e820 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1e830 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1e840 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1e850 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1e860 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1e870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1e880 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
1e890 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69         int i, di
1e8a0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
1e8b0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
1e8c0 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
1e8d0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
1e8e0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
1e8f0 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
1e900 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
1e910 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
1e920 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
1e930 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
1e940 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1e950 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
1e960 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
1e970 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
1e980 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
1e990 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
1e9b0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
1e9c0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
1e9d0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1e9e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1e9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ea00 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1ea10 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
1ea20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
1ea30 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1ea40 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
1ea50 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
1ea60 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
1ea70 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
1ea80 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
1ea90 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
1eaa0 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74 65 33  ( *pPgno>sqlite3
1eab0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1eac0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1ead0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1eae0 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
1eaf0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1eb00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1eb10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1eb20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1eb30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1eb40 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1eb50 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
1eb60 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
1eb70 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
1eb80 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
1eb90 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
1ebc0 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
1ebd0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1ebe0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
1ebf0 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
1ec00 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
1ec10 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
1ec20 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
1ec30 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1ec40 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1ec50 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
1ec60 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
1ec70 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
1ec80 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1ec90 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
1eca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ecb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1ecc0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1ecd0 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65  ollback((*ppPage
1ece0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1ecf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1ed00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ed10 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1ed20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1ed30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ed40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ed50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ed60 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
1ed70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ed80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
1ed90 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1eda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1edb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1edc0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1edd0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1ede0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
1edf0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
1ee00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1ee10 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
1ee20 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1ee30 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
1ee40 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
1ee50 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
1ee60 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50   file */.    *pP
1ee70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67  gno = sqlite3Pag
1ee80 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1ee90 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23  >pPager) + 1;..#
1eea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1eeb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1eec0 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
1eed0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  c ){.      /* An
1eee0 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73   incr-vacuum has
1eef0 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74   already run wit
1ef00 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
1ef10 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20  tion. So the.   
1ef20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c     ** page to al
1ef30 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72  locate is not fr
1ef40 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  om the physical 
1ef50 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  end of the file,
1ef60 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74   but.      ** at
1ef70 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20   pBt->nTrunc. . 
1ef80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70       */.      *p
1ef90 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Pgno = pBt->nTru
1efa0 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  nc+1;.      if( 
1efb0 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
1efc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1efd0 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e  {.        (*pPgn
1efe0 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o)++;.      }.  
1eff0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1f000 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
1f010 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f020 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
1f030 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
1f040 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
1f050 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
1f060 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
1f070 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
1f080 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1f090 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
1f0a0 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
1f0b0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
1f0c0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
1f0d0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
1f0e0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
1f0f0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
1f100 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
1f110 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  /.      TRACE(("
1f120 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1f130 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
1f140 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
1f150 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1f160 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1f170 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
1f180 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
1f190 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
1f1a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f1b0 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20  Bt->nTrunc ){.  
1f1c0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
1f1d0 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a  = *pPgno;.    }.
1f1e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
1f1f0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1f200 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f210 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  t) );.    rc = g
1f220 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1f230 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
1f240 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f250 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1f260 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f270 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1f280 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1f2b0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1f2c0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
1f2d0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
1f2e0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
1f2f0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
1f300 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1f310 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1f320 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
1f330 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
1f340 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1f350 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
1f360 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1f370 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f380 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61  ../*.** Add a pa
1f390 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1f3a0 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66  se file to the f
1f3b0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73  reelist..**.** s
1f3c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f3d0 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64  () is NOT called
1f3e0 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
1f3f0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
1f400 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
1f410 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
1f420 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1f430 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1f440 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1f450 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
1f460 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
1f470 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
1f480 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
1f490 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
1f4a0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   );.  pPage->isI
1f4b0 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nit = 0;.  relea
1f4c0 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50  sePage(pPage->pP
1f4d0 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d  arent);.  pPage-
1f4e0 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20  >pParent = 0;.. 
1f4f0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1f500 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
1f510 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
1f520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f530 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1f540 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1f550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f560 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
1f570 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1f580 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
1f590 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1f5a0 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66  ], n+1);..#ifdef
1f5b0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
1f5c0 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68  ELETE.  /* If th
1f5d0 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  e SQLITE_SECURE_
1f5e0 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74  DELETE compile-t
1f5f0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ime option is en
1f600 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  abled, then.  **
1f610 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
1f620 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
1f630 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
1f640 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72   zeros..  */.  r
1f650 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f660 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1f670 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1f680 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
1f690 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1f6a0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
1f6b0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
1f6c0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1f6d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f6e0 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65  CUUM.  /* If the
1f6f0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
1f700 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
1f710 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
1f720 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
1f730 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
1f740 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
1f750 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
1f760 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1f770 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1f780 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1f790 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52  pPage->pgno, PTR
1f7a0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29  MAP_FREEPAGE, 0)
1f7b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1f7c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
1f7d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30  ndif..  if( n==0
1f7e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1f7f0 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72 65  is the first fre
1f800 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63  e page */.    rc
1f810 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f820 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
1f830 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f840 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f850 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
1f860 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20  aData, 0, 8);.  
1f870 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f880 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70  e1->aData[32], p
1f890 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
1f8a0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
1f8b0 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c  GE: %d first\n",
1f8c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
1f8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f8e0 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65 73  Other free pages
1f8f0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
1f900 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69 72   Retrive the fir
1f910 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
1f920 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65    ** of the free
1f930 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75  list and find ou
1f940 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65  t how many leave
1f950 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20  s it has. */.   
1f960 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1f970 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
1f980 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
1f990 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1f9a0 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30  32]), &pTrunk, 0
1f9b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f9c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b  return rc;.    k
1f9d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1f9e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1f9f0 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e      if( k>=pBt->
1fa00 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1fa10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1fa20 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20   trunk is full. 
1fa30 20 54 75 72 6e 20 74 68 65 20 70 61 67 65 20 62   Turn the page b
1fa40 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f 20  eing freed into 
1fa50 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 74  a new.      ** t
1fa60 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20 6e  runk page with n
1fa70 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20  o leaves. */.   
1fa80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fa90 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
1faa0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1fab0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1fac0 20 72 63 3b 0a 20 20 20 20 20 20 70 75 74 34 62   rc;.      put4b
1fad0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1fae0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
1faf0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1fb00 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
1fb10 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1fb20 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1fb30 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1fb40 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 54 52 41  pgno);.      TRA
1fb50 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1fb60 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
1fb70 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
1fb80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fb90 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54   pPage->pgno, pT
1fba0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
1fbb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1fbc0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
1fbd0 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
1fbe0 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
1fbf0 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
1fc00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fc10 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1fc20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1fc30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fc40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1fc50 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1fc60 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
1fc70 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1fc80 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1fc90 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
1fca0 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
1fcb0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1fcc0 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ETE.        sqli
1fcd0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1fce0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1fcf0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1fd00 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
1fd10 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
1fd20 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
1fd30 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
1fd40 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
1fd50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
1fd60 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
1fd70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1fd80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  c;.}../*.** Get 
1fd90 61 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  a MemPage struct
1fda0 75 72 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  ure for overflow
1fdb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 76 66   page number ovf
1fdc0 6c 2e 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 6e  l. If it.** is n
1fdd0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20 70 61 67  ot zero, the pag
1fde0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1fdf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 66 6f  overflow page fo
1fe00 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 6f  llowing the.** o
1fe10 6e 65 20 72 65 74 72 69 65 76 65 64 20 69 73 20  ne retrieved is 
1fe20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1fe30 6f 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  oNext..**.** If 
1fe40 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1fe50 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
1fe60 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6f 66 20   page-number of 
1fe70 74 68 65 20 6e 65 78 74 0a 2a 2a 20 6f 76 65 72  the next.** over
1fe80 66 6c 6f 77 20 70 61 67 65 20 77 69 74 68 6f 75  flow page withou
1fe90 74 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  t reading the da
1fea0 74 61 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 2c  ta of page ovfl,
1feb0 20 74 68 65 6e 20 0a 2a 2a 20 73 71 6c 69 74 65   then .** sqlite
1fec0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
1fed0 69 73 20 70 61 73 73 65 64 20 74 68 65 20 22 6e  is passed the "n
1fee0 6f 43 6f 6e 74 65 6e 74 22 20 66 6c 61 67 20 77  oContent" flag w
1fef0 68 65 6e 0a 2a 2a 20 70 61 67 65 20 6f 76 66 6c  hen.** page ovfl
1ff00 20 69 73 20 72 65 74 72 69 65 76 65 64 2e 0a 2a   is retrieved..*
1ff10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1ff20 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
1ff30 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
1ff40 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 0a 20 20    Pgno ovfl, .  
1ff50 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1ff60 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1ff70 4e 65 78 74 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  Next.){.  Pgno n
1ff80 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ext = 0;.  int r
1ff90 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 67 6e 6f  c;..  if( !pPgno
1ffa0 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Next ){.    retu
1ffb0 72 6e 20 67 65 74 50 61 67 65 28 70 42 74 2c 20  rn getPage(pBt, 
1ffc0 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29  ovfl, ppPage, 1)
1ffd0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1ffe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fff0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
20000 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
20010 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
20020 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
20030 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
20040 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
20050 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
20060 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
20070 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
20080 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20090 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
200a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
200b0 20 69 47 75 65 73 73 3c 73 71 6c 69 74 65 33 50   iGuess<sqlite3P
200c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
200d0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
200e0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
200f0 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
20100 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
20110 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20140 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20150 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
20160 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
20170 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
20180 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
20190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
201a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d  }.#endif..  rc =
201b0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76   getPage(pBt, ov
201c0 66 6c 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  fl, ppPage, 0);.
201d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
201e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
201f0 74 28 6e 65 78 74 3d 3d 30 20 7c 7c 20 6e 65 78  t(next==0 || nex
20200 74 3d 3d 67 65 74 34 62 79 74 65 28 28 2a 70 70  t==get4byte((*pp
20210 50 61 67 65 29 2d 3e 61 44 61 74 61 29 29 3b 0a  Page)->aData));.
20220 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
20230 79 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 61  yte((*ppPage)->a
20240 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 2a 70 50  Data);.  }.  *pP
20250 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
20260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20270 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
20280 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
20290 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
202a0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
202b0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
202c0 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
202d0 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
202e0 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
202f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20300 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
20310 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
20320 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
20330 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
20340 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
20350 67 65 53 69 7a 65 3b 0a 0a 20 20 70 61 72 73 65  geSize;..  parse
20360 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
20370 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
20380 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
20390 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
203a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
203b0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
203c0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
203d0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
203e0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
203f0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
20400 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
20410 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c  erflow]);.  ovfl
20420 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
20430 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
20440 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
20450 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
20460 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
20470 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
20480 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
20490 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
204a0 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
204b0 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
204c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
204d0 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  vfl;.    if( ovf
204e0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c  lPgno==0 || ovfl
204f0 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  Pgno>sqlite3Page
20500 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
20510 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
20520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20530 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
20540 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74   }..    rc = get
20550 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
20560 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
20570 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30  fl, (nOvfl==0)?0
20580 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  :&ovflPgno);.   
20590 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
205a0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72   rc;.    rc = fr
205b0 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  eePage(pOvfl);. 
205c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
205d0 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
205e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
205f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20600 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
20610 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
20620 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
20630 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
20640 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
20650 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
20660 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
20670 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
20680 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
20690 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
206a0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
206b0 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
206c0 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
206d0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
206e0 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
206f0 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
20700 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
20710 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
20720 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
20730 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
20740 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
20750 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
20760 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
20770 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
20780 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
20790 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
207a0 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
207b0 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
207c0 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
207d0 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
207e0 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
207f0 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
20800 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
20810 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
20820 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
20830 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
20840 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
20850 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
20860 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
20870 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
20880 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
20890 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
208a0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
208b0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
208c0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
208d0 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
208e0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
208f0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
20900 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
20910 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
20920 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
20930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20940 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
20950 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
20960 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
20970 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
20980 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
20990 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
209a0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
209b0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
209c0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
209d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
209e0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
209f0 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
20a00 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
20a10 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
20a20 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
20a30 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
20a40 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
20a50 20 69 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c   info;..  /* Fil
20a60 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
20a70 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
20a80 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
20a90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
20aa0 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
20ab0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
20ac0 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
20ad0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
20ae0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
20af0 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65   nData);.  }else
20b00 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  {.    nData = 0;
20b10 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
20b20 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
20b30 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
20b40 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 70 61  64*)&nKey);.  pa
20b50 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
20b60 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
20b70 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
20b80 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
20b90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
20ba0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
20bb0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
20bc0 6e 44 61 74 61 3d 3d 6e 44 61 74 61 20 29 3b 0a  nData==nData );.
20bd0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
20be0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
20bf0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
20c00 61 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  a;.  if( pPage->
20c10 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
20c20 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
20c30 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
20c40 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
20c50 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  else{.    nPaylo
20c60 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
20c70 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
20c80 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20   nSrc = nKey;.  
20c90 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
20ca0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
20cb0 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
20cc0 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
20cd0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
20ce0 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
20cf0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
20d00 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
20d10 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
20d20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
20d30 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
20d40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20d50 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
20d60 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
20d70 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
20d80 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
20d90 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
20da0 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  /.#endif.      r
20db0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
20dc0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
20dd0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
20de0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
20df0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20e00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
20e10 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
20e20 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
20e30 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
20e40 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
20e50 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
20e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
20e70 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
20e80 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
20e90 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
20ea0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
20eb0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 54 68  hat page now. Th
20ec0 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
20ed0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
20ee0 61 67 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  age will be.    
20ef0 20 20 2a 2a 20 61 64 64 65 64 20 6c 61 74 65 72    ** added later
20f00 2c 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  , by the insertC
20f10 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20  ell() routine.. 
20f20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
20f30 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20f40 6d 20 26 26 20 70 67 6e 6f 50 74 72 6d 61 70 21  m && pgnoPtrmap!
20f50 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
20f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
20f70 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
20f80 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
20f90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 70  MAP_OVERFLOW2, p
20fa0 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  gnoPtrmap);.    
20fb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
20fc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20fd0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20fe0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
20ff0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
21010 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
21020 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
21030 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
21040 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
21050 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
21060 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
21070 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
21080 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
21090 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
210a0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
210b0 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
210c0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
210d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
210e0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
210f0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
21100 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
21110 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
21120 0a 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20  .    if( n>nSrc 
21130 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
21140 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
21150 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
21160 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
21170 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
21180 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
21190 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
211a0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
211b0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
211c0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
211d0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
211e0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
211f0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
21200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21210 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
21220 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
21230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21240 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d  .** Change the M
21250 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70  emPage.pParent p
21260 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61  ointer on the pa
21270 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20  ge whose number 
21280 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74  is.** given in t
21290 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
212a0 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61  nt so that MemPa
212b0 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  ge.pParent holds
212c0 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20   the.** pointer 
212d0 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67  in the third arg
212e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
212f0 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67   int reparentPag
21300 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
21310 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50   Pgno pgno, MemP
21320 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c  age *pNewParent,
21330 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d   int idx){.  Mem
21340 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44  Page *pThis;.  D
21350 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
21360 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 50  .  assert( pNewP
21370 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  arent!=0 );.  if
21380 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  ( pgno==0 ) retu
21390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
213a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
213b0 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50  ger!=0 );.  pDbP
213c0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
213d0 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
213e0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
213f0 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
21400 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61    pThis = (MemPa
21410 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
21420 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
21430 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69  e);.    if( pThi
21440 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  s->isInit ){.   
21450 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73     assert( pThis
21460 2d 3e 61 44 61 74 61 3d 3d 28 73 71 6c 69 74 65  ->aData==(sqlite
21470 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
21480 62 50 61 67 65 29 29 20 29 3b 0a 20 20 20 20 20  bPage)) );.     
21490 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
214a0 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20  ent!=pNewParent 
214b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
214c0 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20  This->pParent ) 
214d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
214e0 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  f(pThis->pParent
214f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21500 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65      pThis->pPare
21510 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b  nt = pNewParent;
21520 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21530 50 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72  PagerRef(pNewPar
21540 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
21550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68       }.      pTh
21560 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  is->idxParent = 
21570 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  idx;.    }.    s
21580 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
21590 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
215a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
215b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
215c0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
215d0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75  cuum ){.    retu
215e0 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74  rn ptrmapPut(pBt
215f0 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
21600 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74  TREE, pNewParent
21610 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e  ->pgno);.  }.#en
21620 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
21630 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
21640 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50  ** Change the pP
21650 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66  arent pointer of
21660 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
21670 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20   pPage to point 
21680 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65  back.** to pPage
21690 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
216a0 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72   words, for ever
216b0 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65  y child of pPage
216c0 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e  , invoke reparen
216d0 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61  tPage().** to ma
216e0 6b 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63  ke sure that eac
216f0 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68  h child knows th
21700 61 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20  at pPage is its 
21710 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  parent..**.** Th
21720 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
21730 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75  called after you
21740 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61   memcpy() one pa
21750 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68  ge into.** anoth
21760 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
21770 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  t reparentChildP
21780 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  ages(MemPage *pP
21790 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  age){.  int i;. 
217a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
217b0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
217c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
217d0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  K;..  if( pPage-
217e0 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53  >leaf ) return S
217f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72  QLITE_OK;..  for
21800 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
21810 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
21820 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
21830 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
21840 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
21850 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
21860 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
21870 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
21880 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b  ell), pPage, i);
21890 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
218a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
218b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
218c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
218d0 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  af ){.    rc = r
218e0 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
218f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21900 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
21910 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20  drOffset+8]), . 
21920 20 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b        pPage, i);
21930 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
21940 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  hift = 0;.  }.  
21950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21960 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
21970 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
21980 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
21990 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
219a0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
219b0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
219c0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
219d0 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
219e0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
219f0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
21a00 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
21a10 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
21a20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
21a30 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
21a40 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
21a50 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
21a60 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
21a70 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
21a80 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
21a90 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
21aa0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
21ab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
21ac0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29  int idx, int sz)
21ad0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
21ae0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21af0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
21b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
21b10 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
21b20 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
21b30 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
21b40 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
21b50 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
21b60 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
21b70 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
21b80 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
21b90 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
21ba0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
21bb0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
21bc0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
21bd0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
21be0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
21bf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21c00 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
21c10 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
21c20 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
21c30 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
21c40 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
21c50 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
21c60 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
21c70 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
21c80 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
21c90 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
21ca0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
21cb0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
21cc0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
21cd0 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
21ce0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
21cf0 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
21d00 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
21d10 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
21d20 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
21d30 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
21d40 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
21d50 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
21d60 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
21d70 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
21d80 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
21d90 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
21da0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
21db0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
21dc0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
21dd0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
21de0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
21df0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
21e00 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
21e10 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
21e20 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
21e30 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
21e40 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
21e50 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
21e60 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
21e70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
21e80 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
21e90 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
21ea0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
21eb0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
21ec0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
21ed0 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
21ee0 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
21ef0 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
21f00 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
21f10 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
21f20 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
21f30 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
21f40 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
21f50 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
21f60 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
21f70 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
21f80 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
21f90 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
21fa0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
21fb0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
21fc0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
21fd0 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
21fe0 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
21ff0 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
22000 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
22010 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
22020 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
22030 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
22040 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
22050 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
22060 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
22070 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
22080 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
22090 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
220a0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
220b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
220c0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
220d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
220e0 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
220f0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
22100 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
22110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
22120 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
22130 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
22140 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
22150 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
22160 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
22170 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
22180 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
22190 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
221a0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
221b0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
221c0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
221d0 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
221e0 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
221f0 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
22200 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
22210 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
22220 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
22230 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
22240 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
22250 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
22260 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
22270 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
22280 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
22290 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
222a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
222b0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
222c0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
222d0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
222e0 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
222f0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
22300 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
22310 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
22320 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
22330 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22340 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
22350 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
22360 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
22370 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
22380 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
22390 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
223a0 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
223b0 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
223c0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
223d0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
223e0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
223f0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
22400 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
22410 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
22420 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
22430 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
22440 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
22450 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
22460 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
22470 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
22480 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
22490 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
224a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
224b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
224c0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
224d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
224e0 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
224f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22500 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22510 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
22520 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
22530 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
22540 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
22550 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
22560 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
22570 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
22580 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
22590 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
225a0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
225b0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
225c0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
225d0 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
225e0 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
225f0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
22600 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
22610 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
22620 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
22630 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
22640 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
22650 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
22660 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
22670 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
22680 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
22690 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
226a0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
226b0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
226c0 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
226d0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
226e0 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
226f0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
22700 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
22710 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
22720 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
22730 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
22740 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
22750 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
22760 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
22770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22780 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22790 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
227a0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
227b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
227c0 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
227d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
227e0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
227f0 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
22800 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
22810 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
22820 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
22830 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
22840 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
22850 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
22860 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
22870 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
22880 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
22890 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
228a0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
228b0 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
228c0 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
228d0 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
228e0 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
228f0 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
22900 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
22910 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
22920 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
22930 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
22940 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
22950 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
22960 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64  Shift = 1;.#ifnd
22970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
22980 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
22990 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
229a0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
229b0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
229c0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
229d0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
229e0 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
229f0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
22a00 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
22a10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
22a20 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
22a30 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
22a40 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
22a50 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65 43 65  o;.      parseCe
22a60 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
22a70 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
22a80 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
22a90 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
22aa0 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
22ab0 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
22ac0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
22ad0 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
22ae0 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
22af0 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
22b00 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
22b10 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
22b20 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
22b30 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
22b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
22b50 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
22b60 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
22b70 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
22b80 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
22b90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
22ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22bb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
22bc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
22bd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
22be0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22bf0 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
22c00 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
22c10 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
22c20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
22c30 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
22c40 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
22c50 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
22c60 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
22c70 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
22c80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22c90 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
22ca0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
22cb0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
22cc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
22cd0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
22ce0 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
22cf0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
22d00 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
22d10 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
22d20 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  odies */.  int *
22d30 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
22d40 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
22d50 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
22d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22d70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22d80 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
22d90 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
22da0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
22db0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
22dc0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
22dd0 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
22de0 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
22df0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
22e00 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
22e10 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
22e20 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
22e30 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
22e40 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
22e50 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
22e60 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
22e70 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
22e80 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
22e90 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61  low==0 );.  tota
22ea0 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72  lSize = 0;.  for
22eb0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
22ec0 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69  ++){.    totalSi
22ed0 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  ze += aSize[i];.
22ee0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f    }.  assert( to
22ef0 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c  talSize+2*nCell<
22f00 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b  =pPage->nFree );
22f10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22f20 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
22f30 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d  cellptr = pPage-
22f40 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64  >cellOffset;.  d
22f50 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
22f60 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
22f70 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
22f80 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
22f90 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
22fa0 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20   if( nCell ){.  
22fb0 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c    cellbody = all
22fc0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
22fd0 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20  , totalSize);.  
22fe0 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
22ff0 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dy>0 );.    asse
23000 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
23010 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20   >= 2*nCell );. 
23020 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
23030 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20  -= 2*nCell;.    
23040 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
23050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75  ; i++){.      pu
23060 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
23070 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  lptr], cellbody)
23080 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
23090 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
230a0 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
230b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c  [i]);.      cell
230c0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ptr += 2;.      
230d0 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a  cellbody += aSiz
230e0 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e[i];.    }.    
230f0 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
23100 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
23110 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  ableSize );.  }.
23120 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
23130 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nCell;.}../*.**
23140 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
23150 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
23160 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
23170 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
23180 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
23190 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
231a0 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
231b0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
231c0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
231d0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
231e0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
231f0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
23200 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
23210 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
23220 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
23230 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
23240 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
23250 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
23260 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
23270 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
23280 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
23290 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
232a0 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
232b0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
232c0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
232d0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
232e0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
232f0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
23300 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
23310 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
23320 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
23330 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
23340 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
23350 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
23360 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
23370 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
23380 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
23390 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
233a0 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
233b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
233c0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
233d0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
233e0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
233f0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
23400 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
23410 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
23420 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f  he balance */../
23430 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
23440 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
23450 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67  t balance(MemPag
23460 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64  e*, int);..#ifnd
23470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
23480 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
23490 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
234a0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
234b0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
234c0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
234d0 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
234e0 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
234f0 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
23500 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
23510 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
23520 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
23530 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
23540 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
23550 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
23560 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
23570 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
23580 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
23590 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
235a0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
235b0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
235c0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
235d0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
235e0 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
235f0 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
23600 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
23610 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
23620 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
23630 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
23640 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
23650 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
23660 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
23670 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
23680 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
23690 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
236a0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
236b0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
236c0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
236d0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
236e0 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
236f0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
23700 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
23710 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
23720 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
23730 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
23740 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
23750 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
23760 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
23770 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
23780 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
23790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
237a0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
237b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d  Page *pPage, Mem
237c0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a  Page *pParent){.
237d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
237e0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e  age *pNew;.  Pgn
237f0 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20  o pgnoNew;.  u8 
23800 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a  *pCell;.  int sz
23810 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  Cell;.  CellInfo
23820 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65   info;.  BtShare
23830 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
23840 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e  pBt;.  int paren
23850 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e  tIdx = pParent->
23860 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72  nCell;   /* pPar
23870 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20  ent new divider 
23880 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
23890 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20  int parentSize; 
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77    /* Size of new
238c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
238d0 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c  .  u8 parentCell
238e0 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [64];           
238f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
23900 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  r the new divide
23910 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  r cell */..  /* 
23920 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
23930 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
23940 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
23950 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
23960 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
23970 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
23980 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
23990 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
239a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
239b0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
239c0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
239d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
239e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
239f0 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
23a00 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
23a10 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
23a20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
23a30 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
23a40 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
23a50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
23a60 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
23a70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
23a80 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
23a90 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
23aa0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
23ab0 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
23ac0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
23ad0 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
23ae0 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
23af0 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
23b00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
23b10 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
23b20 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
23b30 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
23b40 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
23b50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
23b60 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  is.  ** so that 
23b70 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
23b80 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
23b90 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
23ba0 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69  and.  ** pPage i
23bb0 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
23bc0 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f  ght child. .  */
23bd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23be0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70  ->nCell>0 );.  p
23bf0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
23c00 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
23c10 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
23c20 31 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63  1), &info);.  rc
23c30 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
23c40 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
23c50 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
23c60 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69   0, 0, &parentSi
23c70 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
23c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23c90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23ca0 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53   assert( parentS
23cb0 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d  ize<64 );.  rc =
23cc0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
23cd0 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20  ent, parentIdx, 
23ce0 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65  parentCell, pare
23cf0 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20  ntSize, 0, 4);. 
23d00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23d10 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
23d20 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62   rc;.  }.  put4b
23d30 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
23d40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72  Cell(pParent,par
23d50 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e  entIdx), pPage->
23d60 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74  pgno);.  put4byt
23d70 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
23d80 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
23d90 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
23da0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
23db0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23dc0 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  UM.  /* If this 
23dd0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
23de0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
23df0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
23e00 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  ap.  ** with ent
23e10 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
23e20 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
23e30 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
23e40 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68  .  ** cell on th
23e50 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
23e60 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
23e70 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
23e80 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
23e90 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
23ea0 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
23eb0 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
23ec0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
23ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23ee0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
23ef0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
23f00 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
23f10 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 69 66  pNew, 0);.    if
23f20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23f30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
23f40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
23f50 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ndif..  /* Relea
23f60 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
23f70 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
23f80 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65   and balance the
23f90 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20   parent page,.  
23fa0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64  ** in case the d
23fb0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65  ivider cell inse
23fc0 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74  rted caused it t
23fd0 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
23fe0 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  l..  */.  releas
23ff0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72  ePage(pNew);.  r
24000 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50  eturn balance(pP
24010 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e  arent, 0);.}.#en
24020 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
24030 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
24040 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 53  */../*.** The IS
24050 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
24060 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
24070 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
24080 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a  ) to determine.*
24090 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
240a0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
240b0 76 61 63 75 75 6d 20 6f 72 20 6e 6f 74 2e 20 42  vacuum or not. B
240c0 65 63 61 75 73 65 20 69 74 20 69 73 20 75 73 65  ecause it is use
240d0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61 6e 20 65  d.** within an e
240e0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
240f0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
24100 20 61 6e 6f 74 68 65 72 20 6d 61 63 72 6f 20 0a   another macro .
24110 2a 2a 20 28 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ** (sqliteMalloc
24120 52 61 77 29 2c 20 69 74 20 69 73 20 6e 6f 74 20  Raw), it is not 
24130 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
24140 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70  conditional comp
24150 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20  ilation..** So, 
24160 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 64 65  this macro is de
24170 66 69 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  fined instead..*
24180 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
24190 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
241a0 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56  .#define ISAUTOV
241b0 41 43 55 55 4d 20 28 70 42 74 2d 3e 61 75 74 6f  ACUUM (pBt->auto
241c0 56 61 63 75 75 6d 29 0a 23 65 6c 73 65 0a 23 64  Vacuum).#else.#d
241d0 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55  efine ISAUTOVACU
241e0 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  UM 0.#endif../*.
241f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24200 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65  redistributes Ce
24210 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64  lls on pPage and
24220 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c   up to NN*2 sibl
24230 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65  ings.** of pPage
24240 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
24250 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
24260 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  e same amount of
24270 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20   free space..** 
24280 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69  Usually NN sibli
24290 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ngs on either si
242a0 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75  de of pPage is u
242b0 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
242c0 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  cing,.** though 
242d0 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69  more siblings mi
242e0 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
242f0 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20  e side if pPage 
24300 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
24310 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
24320 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66   its parent.  If
24330 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72   pPage has fewer
24340 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69   than 2*NN sibli
24350 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e  ngs.** (somethin
24360 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
24370 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65   happen if pPage
24380 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
24390 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64  e or a .** child
243a0 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61   of root) then a
243b0 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
243c0 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74  lings participat
243d0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
243e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
243f0 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
24400 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20   of pPage might 
24410 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
24420 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
24430 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e   or.** two in an
24440 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
24450 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
24460 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
24470 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61  ull. The root pa
24480 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c  ge.** is special
24490 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20   and is allowed 
244a0 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  to be nearly emp
244b0 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20  ty. If pPage is 
244c0 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
244d0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74  e, then the dept
244e0 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69  h of the tree mi
244f0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
24500 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64  .** or decreased
24510 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65   by one, as nece
24520 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74  ssary, to keep t
24530 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f  he root page fro
24540 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  m being.** overf
24550 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c  ull or completel
24560 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e  y empty..**.** N
24570 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
24580 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
24590 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68  lled, some of th
245a0 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e Cells on pPage
245b0 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
245c0 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
245d0 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
245e0 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  [].  This can ha
245f0 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
24600 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
24610 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f    Part of the jo
24620 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
24630 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  e is to.** make 
24640 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66  sure all Cells f
24650 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67  or pPage once ag
24660 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65  ain fit in pPage
24670 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a  ->aData[]..**.**
24680 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
24690 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
246a0 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
246b0 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  e, the parent of
246c0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
246d0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
246e0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49  or underfull.  I
246f0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  f that happens, 
24700 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
24710 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72  e.** is called r
24720 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
24730 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  e parent..**.** 
24740 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
24750 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
24760 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
24770 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
24780 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
24790 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69  ted state.  So i
247a0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
247b0 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
247c0 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
247d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
247e0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
247f0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61  ce_nonroot(MemPa
24800 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
24810 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
24820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24830 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
24840 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
24850 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
24860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
24870 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
24880 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
248a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
248b0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
248c0 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
248d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
248e0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
248f0 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
24900 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
24910 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24930 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24940 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
24950 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24970 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24980 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
24990 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
249b0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
249c0 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
249d0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
249f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
24a00 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
24a30 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
24a40 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
24a50 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
24a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
24a70 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
24a80 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
24a90 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
24ac0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
24ad0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
24ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
24af0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
24b00 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
24b10 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b30 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
24b40 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
24b50 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
24b60 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
24b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24b80 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
24b90 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
24ba0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
24bb0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
24bc0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
24bd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
24be0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
24bf0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
24c00 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
24c10 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
24c20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
24c30 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b   int iSpace = 0;
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c50 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
24c60 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a  te of aSpace[] *
24c70 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
24c80 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
24c90 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
24ca0 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
24cb0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
24cc0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
24cd0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
24ce0 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
24cf0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
24d00 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
24d10 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
24d20 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
24d30 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
24d40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
24d50 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
24d60 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
24d70 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
24d80 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
24d90 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
24da0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
24db0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
24dc0 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
24dd0 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
24de0 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e00 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
24e10 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
24e20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
24e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24e40 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
24e50 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
24e60 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
24e70 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
24e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
24e90 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
24ea0 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
24eb0 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
24ec0 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
24ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
24ee0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
24ef0 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  anced */.  int *
24f00 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
24f10 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
24f20 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
24f30 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
24f40 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
24f50 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
24f60 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f   /* Space for ho
24f70 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70  lding data of ap
24f80 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Copy[] */.  u8 *
24f90 61 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  aSpace;         
24fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24fb0 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73  e to hold copies
24fc0 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
24fd0 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ls */.#ifndef SQ
24fe0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24ff0 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d  CUUM.  u8 *aFrom
25000 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
25010 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68  /* .  ** Find th
25020 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
25030 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
25040 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
25050 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25060 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25070 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25080 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
25090 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e  e->pBt;.  pParen
250a0 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
250b0 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  nt;.  assert( pP
250c0 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53  arent );.  if( S
250d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
250e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
250f0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
25100 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ge)) ){.    retu
25110 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41  rn rc;.  }.  TRA
25120 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
25130 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
25140 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
25150 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
25160 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64  ->pgno));..#ifnd
25170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
25180 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a  UICKBALANCE.  /*
25190 0a 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20  .  ** A special 
251a0 63 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20  case:  If a new 
251b0 65 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62  entry has just b
251c0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
251d0 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28  o a.  ** table (
251e0 74 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65  that is, a btree
251f0 20 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65   with integer ke
25200 79 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20  ys and all data 
25210 61 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20  at the leaves). 
25220 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20   ** and the new 
25230 65 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67  entry is the rig
25240 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e  ht-most entry in
25250 20 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61   the tree (it ha
25260 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65  s the.  ** large
25270 73 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65  st key) then use
25280 20 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c   the special bal
25290 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75  ance_quick() rou
252a0 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61  tine for.  ** ba
252b0 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63  lancing.  balanc
252c0 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63  e_quick() is muc
252d0 68 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73  h faster and res
252e0 75 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65  ults in a tighte
252f0 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f  r.  ** packing o
25300 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f  f data in the co
25310 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  mmon case..  */.
25320 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
25330 66 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  f &&.      pPage
25340 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20  ->intKey &&.    
25350 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74    pPage->leafDat
25360 61 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  a &&.      pPage
25370 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26  ->nOverflow==1 &
25380 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61  &.      pPage->a
25390 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
253a0 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20  ge->nCell &&.   
253b0 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
253c0 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20  t->pgno!=1 &&.  
253d0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
253e0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
253f0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
25400 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  8])==pPage->pgno
25410 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  .  ){.    /*.   
25420 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   ** TODO: Check 
25430 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20  the siblings to 
25440 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67  the left of pPag
25450 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  e. It may be tha
25460 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72  t.    ** they ar
25470 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e  e not full and n
25480 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65  o new page is re
25490 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
254a0 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63     return balanc
254b0 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70  e_quick(pPage, p
254c0 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  Parent);.  }.#en
254d0 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
254e0 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
254f0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
25500 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
25510 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
25520 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
25530 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
25540 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
25550 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
25560 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
25570 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
25580 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
25590 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
255a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
255b0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
255c0 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
255d0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
255e0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
255f0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
25600 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
25610 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
25620 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
25630 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64     for(idx=0; id
25640 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
25650 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
25660 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  if( get4byte(fin
25670 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
25680 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20  dx))==pgno ){.  
25690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
256a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
256b0 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65  ssert( idx<pPare
256c0 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  nt->nCell.      
256d0 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79         || get4by
256e0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
256f0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25700 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20  ffset+8])==pgno 
25710 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25720 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  idx = pPage->idx
25730 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  Parent;.  }..  /
25740 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  *.  ** Initializ
25750 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74  e variables so t
25760 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hat it will be s
25770 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a  afe to jump.  **
25780 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c   directly to bal
25790 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20  ance_cleanup at 
257a0 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f  any moment..  */
257b0 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d  .  nOld = nNew =
257c0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
257d0 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
257e0 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20  DbPage);..  /*. 
257f0 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
25800 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
25810 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
25820 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
25830 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
25840 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
25850 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
25860 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
25870 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
25880 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
25890 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
258a0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
258b0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
258c0 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
258d0 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
258e0 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
258f0 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
25900 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
25910 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
25920 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
25930 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
25940 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
25950 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
25960 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
25970 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
25980 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
25990 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
259a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
259b0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
259c0 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
259d0 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
259e0 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
259f0 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
25a00 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
25a10 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
25a20 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
25a30 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
25a40 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
25a50 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
25a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
25a70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
25a80 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
25a90 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
25aa0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
25ab0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
25ac0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
25ad0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
25ae0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
25af0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
25b00 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
25b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
25b20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25b30 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
25b40 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
25b50 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20  [i], &apOld[i], 
25b60 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
25b70 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
25b80 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
25b90 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
25ba0 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70  rent = k;.    ap
25bb0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
25bc0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
25bd0 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
25be0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
25bf0 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
25c00 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
25c10 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
25c20 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
25c30 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32   a multiple of 2
25c40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
25c50 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
25c60 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
25c70 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
25c80 61 78 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b  axCells + 1)&~1;
25c90 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
25ca0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
25cb0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
25cc0 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  .  */.  apCell =
25cd0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
25ce0 28 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65  ( .       nMaxCe
25cf0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
25d20 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
25d30 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69  axCells*sizeof(i
25d40 6e 74 29 20 20 20 20 20 20 20 20 20 20 20 20 20  nt)             
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d60 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
25d70 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
25d80 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20  MemPage))*NB    
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20    /* aCopy */.  
25db0 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
25dc0 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20  ze*(5+NB)       
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25de0 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a       /* aSpace *
25df0 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f  /.     + (ISAUTO
25e00 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c  VACUUM ? nMaxCel
25e10 6c 73 20 3a 20 30 29 20 20 20 20 20 20 20 20 20  ls : 0)         
25e20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f           /* aFro
25e30 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  m */.  );.  if( 
25e40 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
25e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25e60 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
25e70 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
25e80 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e  }.  szCell = (in
25e90 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  t*)&apCell[nMaxC
25ea0 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30  ells];.  aCopy[0
25eb0 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  ] = (u8*)&szCell
25ec0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
25ed0 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30  ssert( ((aCopy[0
25ee0 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  ] - (u8*)apCell)
25ef0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
25f00 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
25f10 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f  required */.  fo
25f20 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b  r(i=1; i<NB; i++
25f30 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20  ){.    aCopy[i] 
25f40 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42  = &aCopy[i-1][pB
25f50 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
25f60 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
25f70 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e))];.    assert
25f80 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28  ( ((aCopy[i] - (
25f90 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
25fa0 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
25fb0 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
25fc0 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70  red */.  }.  aSp
25fd0 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d  ace = &aCopy[NB-
25fe0 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1][pBt->pageSize
25ff0 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d  +ROUND8(sizeof(M
26000 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73  emPage))];.  ass
26010 65 72 74 28 20 28 28 61 53 70 61 63 65 20 2d 20  ert( ((aSpace - 
26020 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
26030 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
26040 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
26050 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ired */.#ifndef 
26060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26070 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
26080 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
26090 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70      aFrom = &aSp
260a0 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53  ace[5*pBt->pageS
260b0 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ize];.  }.#endif
260c0 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61  .  .  /*.  ** Ma
260d0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
260e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67   content of pPag
260f0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
26100 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a  gs into aOld[]..
26110 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
26120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
26130 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
26140 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
26150 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  her.  ** that th
26160 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
26170 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
26180 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
26190 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72  e in the.  ** pr
261a0 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
261b0 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  verwritten..  */
261c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
261d0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
261e0 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70  mPage *p = apCop
261f0 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
26200 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e  )&aCopy[i][pBt->
26210 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  pageSize];.    p
26220 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a  ->aData = &((u8*
26230 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69  )p)[-pBt->pageSi
26240 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ze];.    memcpy(
26250 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  p->aData, apOld[
26260 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
26270 70 61 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f  pageSize + sizeo
26280 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
26290 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29   /* The memcpy()
262a0 20 61 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74   above changes t
262b0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61  he value of p->a
262c0 44 61 74 61 20 73 6f 20 77 65 20 68 61 76 65 20  Data so we have 
262d0 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74  to.    ** set it
262e0 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70   again. */.    p
262f0 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a  ->aData = &((u8*
26300 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69  )p)[-pBt->pageSi
26310 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ze];.  }..  /*. 
26320 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
26330 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
26340 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
26350 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
26360 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
26370 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
26380 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
26390 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
263a0 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
263b0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
263c0 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65  ined form aSpace
263d0 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
263e0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65  e the divider Ce
263f0 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
26400 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
26410 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
26420 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
26430 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
26440 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
26450 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
26460 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
26470 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
26480 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
26490 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
264a0 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e  to aSpace[].  In
264b0 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
264c0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
264d0 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
264e0 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
264f0 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
26500 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
26510 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
26520 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
26530 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
26540 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
26550 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
26560 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
26570 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
26580 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
26590 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
265a0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
265b0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
265c0 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
265d0 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
265e0 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
265f0 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
26600 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
26610 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d  ..  */.  nCell =
26620 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   0;.  leafCorrec
26630 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65  tion = pPage->le
26640 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
26650 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61   = pPage->leafDa
26660 74 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  ta && pPage->lea
26670 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  f;.  for(i=0; i<
26680 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
26690 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
266a0 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69  apCopy[i];.    i
266b0 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d  nt limit = pOld-
266c0 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
266d0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28  erflow;.    for(
266e0 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
266f0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
26700 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
26710 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  s );.      apCel
26720 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f  l[nCell] = findO
26730 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64  verflowCell(pOld
26740 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  , j);.      szCe
26750 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
26760 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
26770 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69  Cell[nCell]);.#i
26780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26790 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
267a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
267b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
267c0 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20    int a;.       
267d0 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
267e0 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61  i;.        for(a
267f0 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65  =0; a<pOld->nOve
26800 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20  rflow; a++){.   
26810 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
26820 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d  >aOvfl[a].pCell=
26830 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29  =apCell[nCell] )
26840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46  {.            aF
26850 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
26860 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  F;.            b
26870 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
26880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26890 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
268a0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
268b0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
268c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
268d0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
268e0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
268f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  );.      if( lea
26900 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
26910 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41   /* With the LEA
26920 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72  FDATA flag, pPar
26930 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f  ent cells hold o
26940 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74  nly INTKEYs that
26950 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
26960 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65  duplicates of ke
26970 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ys on the child 
26980 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20  pages.  We need 
26990 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20  to remove.      
269a0 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72    ** the divider
269b0 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72   cells from pPar
269c0 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76  ent, but the div
269d0 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20  iders cells are 
269e0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
269f0 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d  dded to apCell[]
26a00 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
26a10 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
26a20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20  child cells..   
26a30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26a40 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
26a50 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
26a60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a70 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
26a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
26a90 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
26aa0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
26ab0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
26ac0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
26ad0 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20  pace[iSpace];.  
26ae0 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
26af0 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
26b00 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
26b10 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
26b20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
26b30 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
26b40 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65  z);.        apCe
26b50 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
26b60 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
26b70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26b80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
26ba0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
26bb0 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
26bc0 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
26bd0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
26be0 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
26bf0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
26c00 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a   sz);.        sz
26c10 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c  Cell[nCell] -= l
26c20 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
26c30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67         assert( g
26c40 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d  et4byte(pTemp)==
26c50 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20  pgnoOld[i] );.  
26c60 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
26c70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
26c80 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
26c90 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
26ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26cb0 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
26cc0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
26cd0 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
26ce0 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20  e left.         
26cf0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
26d00 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
26d10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
26d20 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
26d30 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
26d40 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  pOld->hdrOffset+
26d50 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  8], 4);.        
26d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26d70 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
26d80 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
26d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26da0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
26db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26dc0 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
26dd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
26de0 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
26df0 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
26e00 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
26e10 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
26e20 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
26e30 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
26e40 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
26e50 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
26e60 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
26e70 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
26e80 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
26e90 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
26ea0 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
26eb0 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
26ec0 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
26ed0 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
26ee0 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
26ef0 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
26f00 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
26f10 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
26f20 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
26f30 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
26f40 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
26f50 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
26f60 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
26f70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
26f80 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
26f90 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
26fa0 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
26fb0 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
26fc0 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
26fd0 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
26ff0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
27000 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
27010 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
27020 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
27030 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
27040 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
27050 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
27060 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
27070 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
27080 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
27090 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
270a0 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
270b0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
270c0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
270d0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
270e0 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
270f0 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
27100 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
27110 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
27120 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
27130 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
27140 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
27150 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
27160 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
27170 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
27180 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
27190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  ;.    }.  }.  sz
271a0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
271b0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
271c0 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
271d0 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
271e0 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
271f0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
27200 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
27210 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
27220 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
27230 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
27240 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
27250 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
27260 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
27270 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
27280 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
27290 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
272a0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
272b0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
272c0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
272d0 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
272e0 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
272f0 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
27300 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
27310 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
27320 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
27330 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
27340 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
27350 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
27360 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
27370 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
27380 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
27390 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
273a0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
273b0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
273c0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
273d0 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
273e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
273f0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
27400 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
27410 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
27420 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
27430 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
27440 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
27450 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
27460 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
27470 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
27480 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
27490 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
274a0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
274b0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
274c0 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
274d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
274e0 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
274f0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
27500 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
27510 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
27520 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
27530 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
27540 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
27550 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
27560 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
27570 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
27580 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
27590 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
275a0 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
275b0 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
275c0 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
275d0 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
275e0 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
275f0 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
27600 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
27610 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
27620 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
27630 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
27640 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
27650 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
27660 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
27670 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
27680 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
27690 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
276a0 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
276b0 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
276c0 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a   we are the.  **
276d0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
276e0 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
276f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
27700 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
27710 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
27720 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
27730 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
27740 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
27750 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
27760 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
27770 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
27780 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
27790 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  0) );..  /*.  **
277a0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
277b0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
277c0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
277d0 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  ssible..  */.  a
277e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
277f0 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c  no>1 );.  pageFl
27800 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ags = pPage->aDa
27810 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
27820 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
27830 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
27840 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
27850 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
27860 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
27870 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
27880 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69  w[i] = pgnoOld[i
27890 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
278a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
278b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
278c0 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
278d0 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
278e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
278f0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27900 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
27910 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27920 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
27930 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
27940 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
27950 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
27960 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
27970 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
27980 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
27990 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
279a0 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  i] = pNew;.     
279b0 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nNew++;.    }. 
279c0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
279d0 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
279e0 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
279f0 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
27a00 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
27a10 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
27a20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
27a30 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ld ){.    rc = f
27a40 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
27a50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27a60 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
27a70 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
27a80 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
27a90 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
27aa0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
27ab0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
27ac0 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
27ad0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
27ae0 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
27af0 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
27b00 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
27b10 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
27b20 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
27b30 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
27b40 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
27b50 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
27b60 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
27b70 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
27b80 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
27b90 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
27ba0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
27bb0 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
27bc0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
27bd0 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
27be0 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
27bf0 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
27c00 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
27c10 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
27c20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
27c30 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
27c40 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
27c50 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
27c60 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
27c70 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
27c80 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
27c90 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
27ca0 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
27cb0 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
27cc0 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
27cd0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
27ce0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
27cf0 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77  t minV = pgnoNew
27d00 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  [i];.    int min
27d10 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
27d20 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
27d30 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e  .      if( pgnoN
27d40 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29  ew[j]<(unsigned)
27d50 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
27d60 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
27d70 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77    minV = pgnoNew
27d80 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
27d90 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
27da0 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
27db0 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
27dc0 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70  *pT;.      t = p
27dd0 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  gnoNew[i];.     
27de0 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
27df0 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
27e00 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d   = pgnoNew[minI]
27e10 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
27e20 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
27e30 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69        pgnoNew[mi
27e40 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61  nI] = t;.      a
27e50 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
27e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
27e70 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
27e80 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77  d: %d %d %d  new
27e90 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
27ea0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
27eb0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e  (%d)\n",.    pgn
27ec0 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f  oOld[0], .    nO
27ed0 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=2 ? pgnoOld[
27ee0 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  1] : 0,.    nOld
27ef0 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d  >=3 ? pgnoOld[2]
27f00 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65   : 0,.    pgnoNe
27f10 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  w[0], szNew[0],.
27f20 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67      nNew>=2 ? pg
27f30 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e  noNew[1] : 0, nN
27f40 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
27f50 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
27f60 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a  3 ? pgnoNew[2] :
27f70 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
27f80 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
27f90 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65  nNew>=4 ? pgnoNe
27fa0 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[3] : 0, nNew>=
27fb0 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
27fc0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
27fd0 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20  pgnoNew[4] : 0, 
27fe0 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
27ff0 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a  4] : 0));..  /*.
28000 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
28010 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
28020 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
28030 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
28040 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
28050 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
28060 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
28070 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
28080 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
28090 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
280a0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
280b0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
280c0 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
280d0 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
280e0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
280f0 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
28100 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
28110 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b  ->pgno==pgnoNew[
28120 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  i] );.    assemb
28130 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
28140 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
28150 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
28160 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28170 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
28180 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
28190 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
281a0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
281b0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
281c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
281d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
281e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
281f0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
28200 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
28210 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
28220 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
28230 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
28240 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  e siblings that 
28250 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e  were rearranged.
28260 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c   These can be: l
28270 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  eft.    ** child
28280 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68  ren of cells, th
28290 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
282a0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76   the page, or ov
282b0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
282c0 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
282d0 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  y cells..    */.
282e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
282f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
28300 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e   for(k=j; k<cntN
28310 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ew[i]; k++){.   
28320 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
28330 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
28340 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d      if( aFrom[k]
28350 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79  ==0xFF || apCopy
28360 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f  [aFrom[k]]->pgno
28370 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a  !=pNew->pgno ){.
28380 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
28390 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
283a0 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20  w, k-j);.       
283b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
283c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
283d0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
283e0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
283f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
28410 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e  ndif..    j = cn
28420 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
28430 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
28440 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
28450 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
28460 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
28470 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
28480 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
28490 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
284a0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
284b0 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20     if( i<nNew-1 
284c0 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  && j<nCell ){.  
284d0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
284e0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
284f0 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
28500 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
28510 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
28520 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
28530 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
28540 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
28550 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
28560 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
28570 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
28580 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
28590 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
285a0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
285b0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
285c0 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09  f( leafData ){..
285d0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
285e0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
285f0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
28600 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
28610 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
28620 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
28630 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
28640 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
28650 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
28660 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
28670 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
28680 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
28690 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
286a0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
286b0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
286c0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
286d0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
286e0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
286f0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
28700 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70    j--;.        p
28710 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
28720 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
28730 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
28740 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70  ll = &aSpace[iSp
28750 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69  ace];.        fi
28760 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
28770 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
28780 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 73 7a  .nKey, 0, 0, &sz
28790 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  );.        iSpac
287a0 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
287b0 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
287c0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
287d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d   );.        pTem
287e0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
287f0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
28800 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
28810 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b  pTemp = &aSpace[
28820 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
28830 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
28840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
28850 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
28860 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
28870 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  }.      rc = ins
28880 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
28890 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
288a0 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
288b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
288c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
288d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
288e0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
288f0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
28900 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e  arent,nxDiv), pN
28910 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64  ew->pgno);.#ifnd
28920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28930 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
28940 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
28950 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
28960 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61  abase, and not a
28970 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
28980 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75  .      ** then u
28990 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
289a0 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e  r map with an en
289b0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
289c0 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
289d0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c  ** that the cell
289e0 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70   just inserted p
289f0 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79  oints to (if any
28a00 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
28a10 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
28a20 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61  acuum && !leafDa
28a30 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ta ){.        rc
28a40 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
28a50 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
28a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28a80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
28a90 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28ab0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b  .#endif.      j+
28ac0 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
28ad0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
28ae0 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
28af0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
28b00 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
28b10 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
28b20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
28b30 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
28b40 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
28b50 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
28b60 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  , &apCopy[nOld-1
28b70 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  ]->aData[8], 4);
28b80 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
28b90 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
28ba0 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  +pParent->nOverf
28bb0 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69  low ){.    /* Ri
28bc0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
28bd0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
28be0 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
28bf0 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ent */.    put4b
28c00 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
28c10 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
28c20 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
28c30 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
28c40 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67  else{.    /* Rig
28c50 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
28c60 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c  is the left chil
28c70 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65  d of the first e
28c80 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a  ntry in pParent.
28c90 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
28ca0 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64  right-most divid
28cb0 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  er entry */.    
28cc0 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
28cd0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
28ce0 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e  t, nxDiv), pgnoN
28cf0 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
28d00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61  ..  /*.  ** Repa
28d10 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66  rent children of
28d20 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   all cells..  */
28d30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
28d40 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ew; i++){.    rc
28d50 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64   = reparentChild
28d60 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b  Pages(apNew[i]);
28d70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28d80 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
28d90 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28da0 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65   }.  rc = repare
28db0 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61  ntChildPages(pPa
28dc0 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
28dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
28de0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28df0 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61  p;..  /*.  ** Ba
28e00 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
28e10 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
28e20 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
28e30 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
28e40 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
28e50 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
28e60 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
28e70 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
28e80 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
28e90 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
28ea0 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
28eb0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
28ec0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28ed0 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
28ee0 29 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  );.  rc = balanc
28ef0 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  e(pParent, 0);. 
28f00 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61   .  /*.  ** Clea
28f10 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
28f20 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
28f30 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
28f40 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29  liteFree(apCell)
28f50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28f60 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
28f70 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
28f80 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
28f90 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
28fa0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
28fb0 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
28fc0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
28fd0 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43  pParent);.  TRAC
28fe0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
28ff0 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
29000 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
29010 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
29020 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
29030 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
29040 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ll));.  return r
29050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
29060 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
29070 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
29080 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
29090 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
290a0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
290b0 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
290c0 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
290d0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
290e0 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
290f0 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
29100 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
29110 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d  ce_shallower(Mem
29120 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
29130 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29150 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
29160 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
29170 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
29180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29190 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
291a0 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
291b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
291c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
291d0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
291e0 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
291f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
29220 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
29230 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
29240 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
29250 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
29260 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
29270 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
29280 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
29290 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
292a0 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
292b0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
292c0 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20    int *szCell;  
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
292e0 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
292f0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
29300 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
29310 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
29320 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
29330 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20  ell==0 );.  pBt 
29340 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
29350 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
29360 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
29370 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d  apCell = sqliteM
29380 61 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c  allocRaw( mxCell
29390 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28  PerPage*(sizeof(
293a0 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29  u8*)+sizeof(int)
293b0 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c  ) );.  if( apCel
293c0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
293d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a  LITE_NOMEM;.  sz
293e0 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70  Cell = (int*)&ap
293f0 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61  Cell[mxCellPerPa
29400 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge];.  if( pPage
29410 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
29420 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f   The table is co
29430 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a  mpletely empty *
29440 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  /.    TRACE(("BA
29450 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62  LANCE: empty tab
29460 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  le %d\n", pPage-
29470 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
29480 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
29490 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20  t page is empty 
294a0 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c  but has one chil
294b0 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  d.  Transfer the
294c0 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
294d0 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
294e0 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
294f0 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
29500 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69   .    ** will fi
29510 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  t.  This reduces
29520 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
29530 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20  e tree by one.. 
29540 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
29550 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
29560 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
29570 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
29580 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  able than.    **
29590 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20   its child (due 
295a0 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20  to the 100 byte 
295b0 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75  header that occu
295c0 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
295d0 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ing.    ** of th
295e0 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c  e database fle),
295f0 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74   so it might not
29600 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64   be able to hold
29610 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20   all of the .   
29620 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
29630 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
29640 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ned in the child
29650 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
29660 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20  e .    ** case, 
29670 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74  then do not do t
29680 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65  he transfer.  Le
29690 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79  ave page 1 empty
296a0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
296b0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
296c0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
296d0 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
296e0 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
296f0 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75      ** the virtu
29700 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  al root of the t
29710 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
29720 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
29730 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29740 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29750 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
29760 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30  ert( pgnoChild>0
29770 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29780 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74  pgnoChild<=sqlit
29790 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
297a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
297b0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
297c0 20 67 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e   getPage(pPage->
297d0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
297e0 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
297f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
29800 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
29810 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
29820 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
29830 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67      rc = initPag
29840 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
29850 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
29860 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
29870 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
29880 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
29890 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
298a0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
298b0 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b  d->nFree>=100 ){
298c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
298d0 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
298e0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  n will fit on th
298f0 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20  e root page, so 
29900 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  do the.        *
29910 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  * copy */.      
29920 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
29930 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
29940 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
29950 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
29960 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
29970 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
29980 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20        apCell[i] 
29990 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c  = findCell(pChil
299a0 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d,i);.          
299b0 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c  szCell[i] = cell
299c0 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20  SizePtr(pChild, 
299d0 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
299e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
299f0 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65  semblePage(pPage
29a00 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c  , pChild->nCell,
29a10 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29   apCell, szCell)
29a20 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;.        /* Cop
29a30 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  y the right-poin
29a40 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
29a50 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20   to the parent. 
29a60 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  */.        put4b
29a70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
29a80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
29a90 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20  et+8], .        
29aa0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43      get4byte(&pC
29ab0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69  hild->aData[pChi
29ac0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
29ad0 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  ));.        free
29ae0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
29af0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
29b00 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
29b10 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65  transfer to page
29b20 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
29b30 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gno));.      }el
29b40 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
29b50 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
29b60 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
29b70 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
29b80 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20  he root..       
29b90 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
29ba0 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
29bb0 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
29bc0 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  /.        TRACE(
29bd0 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
29be0 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
29bf0 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
29c00 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
29c10 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29c20 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
29c30 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68  Page->aData, pCh
29c40 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67  ild->aData, pPag
29c50 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
29c60 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
29c70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
29c80 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65      pPage->pPare
29c90 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  nt = 0;.      rc
29ca0 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61 67   = initPage(pPag
29cb0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  e, 0);.      ass
29cc0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
29cd0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65  OK );.      free
29ce0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
29cf0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
29d00 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68  NCE: transfer ch
29d10 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74  ild %d into root
29d20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
29d30 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67        pChild->pg
29d40 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  no, pPage->pgno)
29d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
29d60 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
29d70 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20  ages(pPage);.   
29d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29d90 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
29da0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29db0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29dc0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
29dd0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
29de0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
29df0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
29e00 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  Cell; i++){ .   
29e10 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29e20 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69  PutOvfl(pPage, i
29e30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29e50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29e60 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
29e70 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
29e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
29e90 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  if.    if( rc!=S
29ea0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
29eb0 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
29ec0 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nce;.    release
29ed0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
29ee0 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
29ef0 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 46  lance:.  sqliteF
29f00 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
29f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
29f20 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
29f30 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
29f40 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
29f50 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
29f60 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
29f70 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
29f80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
29f90 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
29fa0 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
29fb0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
29fc0 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
29fd0 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
29fe0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
29ff0 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
2a000 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
2a010 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
2a020 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
2a030 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
2a040 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
2a050 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
2a060 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
2a070 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a090 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
2a0a0 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2a0b0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
2a0c0 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
2a0d0 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
2a0e0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
2a0f0 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2a100 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2a110 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
2a120 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
2a130 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2a140 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
2a150 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
2a160 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
2a170 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
2a180 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
2a190 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
2a1a0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2a1b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
2a1c0 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
2a1d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2a1e0 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
2a1f0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
2a200 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a210 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
2a220 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
2a230 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20  */.  int brk;   
2a240 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2a250 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
2a260 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
2a270 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
2a280 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
2a290 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
2a2a0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2a2b0 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d  low>0 );.  pBt =
2a2c0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 72   pPage->pBt;.  r
2a2d0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2a2e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69  ePage(pBt, &pChi
2a2f0 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20  ld, &pgnoChild, 
2a300 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pPage->pgno, 0);
2a310 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2a320 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
2a330 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2a340 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
2a350 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75  >pDbPage) );.  u
2a360 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
2a370 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
2a380 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2a390 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
2a3a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2a3b0 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
2a3c0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
2a3d0 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e  cdata = pChild->
2a3e0 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28  aData;.  memcpy(
2a3f0 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72  cdata, &data[hdr
2a400 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ], pPage->cellOf
2a410 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43  fset+2*pPage->nC
2a420 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63  ell-hdr);.  memc
2a430 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20  py(&cdata[brk], 
2a440 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62  &data[brk], usab
2a450 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61  leSize-brk);.  a
2a460 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69  ssert( pChild->i
2a470 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63  sInit==0 );.  rc
2a480 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68 69   = initPage(pChi
2a490 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66  ld, pPage);.  if
2a4a0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2a4b0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2a4c0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
2a4d0 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f  aOvfl, pPage->aO
2a4e0 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  vfl, pPage->nOve
2a4f0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
2a500 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ge->aOvfl[0]));.
2a510 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
2a520 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
2a530 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43  erflow;.  if( pC
2a540 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2a550 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  ){.    pChild->n
2a560 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
2a570 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2a580 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
2a590 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ell );.  zeroPag
2a5a0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2a5b0 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
2a5c0 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
2a5d0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2a5e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2a5f0 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
2a600 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2a610 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
2a620 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
2a630 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
2a640 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64  d->pgno));.#ifnd
2a650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a660 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
2a670 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a680 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2a690 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a6a0 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
2a6b0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2a6c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
2a6d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a6e0 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2a6f0 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  out;.    for(i=0
2a700 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
2a710 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  l; i++){.      r
2a720 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2a730 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20  l(pChild, i);.  
2a740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a760 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
2a780 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61  ndif.  rc = bala
2a790 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69  nce_nonroot(pChi
2a7a0 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65  ld);..balancedee
2a7b0 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  per_out:.  relea
2a7c0 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2a7d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a7e0 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20  /*.** Decide if 
2a7f0 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e  the page pPage n
2a800 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
2a810 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69  ced.  If balanci
2a820 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65  ng is.** require
2a830 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72  d, call the appr
2a840 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
2a850 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  g routine..*/.st
2a860 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2a870 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2a880 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20   int insert){.  
2a890 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a8a0 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  OK;.  if( pPage-
2a8b0 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
2a8c0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f     if( pPage->nO
2a8d0 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
2a8e0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2a8f0 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20  deeper(pPage);. 
2a900 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2a910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2a920 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
2a930 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2a940 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50  nce_shallower(pP
2a950 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  age);.    }.  }e
2a960 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2a970 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2a980 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e  || .        (!in
2a990 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
2a9a0 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
2a9b0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2a9c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2a9d0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2a9e0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
2a9f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2aa00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2aa10 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
2aa20 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
2aa30 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
2aa40 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
2aa50 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
2aa60 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
2aa70 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
2aa80 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
2aa90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2aaa0 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
2aab0 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
2aac0 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
2aad0 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
2aae0 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
2aaf0 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
2ab00 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
2ab10 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
2ab20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
2ab30 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
2ab40 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2ab50 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
2ab60 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64  KED..**.** In ad
2ab70 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69  dition to checki
2ab80 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b  ng for read-lock
2ab90 73 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d  s (where a read-
2aba0 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61  lock .** means a
2abb0 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77   cursor opened w
2abc0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74  ith wrFlag==0) t
2abd0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
2abe0 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63 75   moves.** all cu
2abf0 72 73 6f 72 73 20 77 72 69 74 65 20 63 75 72 73  rsors write curs
2ac00 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ors so that they
2ac10 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f   are pointing to
2ac20 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43   the .** first C
2ac30 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ell on the root 
2ac40 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6e  page.  This is n
2ac50 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
2ac60 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f   an insert .** o
2ac70 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20 63  r delete might c
2ac80 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72  hange the number
2ac90 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70   of cells on a p
2aca0 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a  age or delete.**
2acb0 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c 79   a page entirely
2acc0 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77   and we do not w
2acd0 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e 79  ant to leave any
2ace0 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69   cursors .** poi
2acf0 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69  nting to non-exi
2ad00 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20 63  stant pages or c
2ad10 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
2ad20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  int checkReadLoc
2ad30 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ks(Btree *pBtree
2ad40 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c  , Pgno pgnoRoot,
2ad50 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c   BtCursor *pExcl
2ad60 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ude){.  BtCursor
2ad70 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
2ad80 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
2ad90 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
2ada0 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53 71 6c  b = pBtree->pSql
2adb0 69 74 65 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ite;.  for(p=pBt
2adc0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
2add0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
2ade0 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29  f( p==pExclude )
2adf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2ae00 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55  f( p->eState!=CU
2ae10 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e  RSOR_VALID ) con
2ae20 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2ae30 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f  ->pgnoRoot!=pgno
2ae40 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Root ) continue;
2ae50 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c  .    if( p->wrFl
2ae60 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ag==0 ){.      s
2ae70 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2ae80 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71  = p->pBtree->pSq
2ae90 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  lite;.      if( 
2aea0 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20  dbOther==0 ||.  
2aeb0 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72 21         (dbOther!
2aec0 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d  =db && (dbOther-
2aed0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2aee0 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2aef0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
2af00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2af10 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CKED;.      }.  
2af20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70    }else if( p->p
2af30 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70  Page->pgno!=p->p
2af40 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  gnoRoot ){.     
2af50 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a   moveToRoot(p);.
2af60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2af70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2af80 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2af90 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
2afa0 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
2afb0 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
2afc0 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
2afd0 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
2afe0 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
2aff0 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
2b000 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
2b010 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
2b020 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
2b030 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
2b040 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
2b050 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2b060 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2b070 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2b080 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
2b090 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
2b0a0 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
2b0b0 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
2b0c0 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
2b0d0 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
2b0e0 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
2b0f0 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
2b100 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
2b110 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2b120 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2b130 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2b140 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2b150 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2b160 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
2b170 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
2b180 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2b190 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2b1a0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
2b1b0 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2b1c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2b1d0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2b1e0 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
2b1f0 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2b200 72 64 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65  rd */.  int appe
2b210 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20  ndBias          
2b220 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b230 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79  f this is likely
2b240 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   an append */.){
2b250 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2b260 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65   loc;.  int szNe
2b270 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w;.  MemPage *pP
2b280 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
2b290 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2b2a0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  ree->pBt;.  unsi
2b2b0 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65  gned char *oldCe
2b2c0 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll;.  unsigned c
2b2d0 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30  har *newCell = 0
2b2e0 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  ;..  if( pBt->in
2b2f0 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2b300 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2b310 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2b320 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
2b330 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65  re doing an inse
2b340 72 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  rt */.    return
2b350 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2b360 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2b370 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2b380 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2b390 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2b3a0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2b3b0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2b3c0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2b3d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20    /* Cursor not 
2b3e0 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
2b3f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2b400 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2b410 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2b420 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2b430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b440 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2b450 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2b460 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2b470 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2b480 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2b490 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2b4a0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2b4b0 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2b4c0 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73  e */.  clearCurs
2b4d0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2b4e0 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2b4f0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2b500 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2b510 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2b520 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2b530 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2b540 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2b550 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2b560 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
2b570 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2b580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2b590 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2b5a0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2b5b0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2b5c0 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
2b5d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b5e0 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
2b5f0 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52  leafData );.  TR
2b600 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2b610 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2b620 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2b630 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2b640 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2b650 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2b660 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2b670 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2b680 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2b690 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2b6a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2b6b0 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 73  Init );.  rc = s
2b6c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b6d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b6e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2b6f0 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43 65 6c  urn rc;.  newCel
2b700 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
2b710 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  Raw( MX_CELL_SIZ
2b720 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20  E(pBt) );.  if( 
2b730 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
2b740 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b750 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
2b760 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
2b770 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
2b780 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 26 73  pData, nData, &s
2b790 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
2b7a0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
2b7b0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
2b7c0 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
2b7d0 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
2b7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
2b7f0 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
2b800 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c  (pBt) );.  if( l
2b810 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2b820 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2b830 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ate ){.    int s
2b840 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2b850 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
2b860 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
2b870 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2b880 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
2b890 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b8a0 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
2b8b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b8c0 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
2b8d0 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
2b8e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
2b8f0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b900 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2b910 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2b920 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
2b930 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2b940 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2b950 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2b960 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b970 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65   szOld);.  }else
2b980 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
2b990 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
2b9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b9b0 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70  e->leaf );.    p
2b9c0 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20  Cur->idx++;.    
2b9d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b9e0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2b9f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ba00 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
2ba10 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2ba20 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2ba30 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
2ba40 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2ba50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2ba60 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2ba70 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2ba80 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73  Page, 1);.  /* s
2ba90 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
2baa0 75 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70  ump(pCur->pBt, p
2bab0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31  Cur->pgnoRoot, 1
2bac0 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73  ); */.  /* fflus
2bad0 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
2bae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2baf0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2bb00 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65  oot(pCur);.  }.e
2bb10 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c  nd_insert:.  sql
2bb20 69 74 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29  iteFree(newCell)
2bb30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2bb40 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2bb50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
2bb60 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
2bb70 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
2bb80 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2bb90 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2bba0 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2bbb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2bbc0 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
2bbd0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2bbe0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2bbf0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69  r->pPage;.  unsi
2bc00 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2bc10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
2bc20 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
2bc30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2bc40 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  t = pCur->pBtree
2bc50 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2bc60 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2bc70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
2bc80 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2bc90 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2bca0 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2bcb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
2bcc0 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74  re doing a delet
2bcd0 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
2bce0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2bcf0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2bd00 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2bd10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2bd20 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2bd30 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20    if( pCur->idx 
2bd40 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  >= pPage->nCell 
2bd50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bd60 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
2bd70 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
2bd80 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
2bd90 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
2bda0 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2bdb0 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2bdc0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2bdd0 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74  * Did not open t
2bde0 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77  his cursor for w
2bdf0 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2be00 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2be10 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2be20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2be30 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65   pCur) ){.    re
2be40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2be50 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2be60 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2be70 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2be80 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2be90 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2bea0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2beb0 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2bec0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2bed0 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2bee0 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2bef0 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2bf00 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2bf10 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2bf20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2bf30 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2bf40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2bf50 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2bf60 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2bf70 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2bf80 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2bf90 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2bfa0 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43  (rc = restoreOrC
2bfb0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2bfc0 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  on(pCur))!=0 ||.
2bfd0 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c      (rc = saveAl
2bfe0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2bff0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2c000 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2c010 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c020 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2c030 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a  bPage))!=0.  ){.
2c040 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c050 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2c060 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2c070 69 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65  it's page and le
2c080 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2c090 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2c0a0 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2c0b0 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2c0c0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2c0d0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2c0e0 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2c0f0 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2c100 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2c110 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
2c120 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2c130 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2c140 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c150 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
2c160 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2c170 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
2c180 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2c190 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
2c1a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
2c1b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2c1c0 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2c1d0 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2c1e0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2c1f0 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2c200 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2c210 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2c220 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2c230 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2c240 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2c250 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2c260 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2c270 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2c280 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2c290 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2c2a0 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2c2b0 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2c2c0 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2c2d0 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2c2e0 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2c2f0 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2c300 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2c310 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2c320 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2c330 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2c340 69 6e 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20  int szNext;  /* 
2c350 54 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  The compiler war
2c360 6e 69 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73  ning is wrong: s
2c370 7a 4e 65 78 74 20 69 73 20 61 6c 77 61 79 73 20  zNext is always 
2c380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c390 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
2c3a0 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64   before use.  Ad
2c3b0 64 69 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e  ding an extra in
2c3c0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c3e0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20   to silence the 
2c3f0 63 6f 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64  compiler slows d
2c400 6f 77 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f  own the code. */
2c410 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
2c420 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2c430 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20  har *tempCell = 
2c440 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
2c450 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2c460 29 3b 0a 20 20 20 20 67 65 74 54 65 6d 70 43 75  );.    getTempCu
2c470 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
2c480 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
2c490 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2c4a0 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
2c4b0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2c4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c4d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c4e0 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43  PagerWrite(leafC
2c4f0 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ur.pPage->pDbPag
2c500 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2c510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c520 29 7b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  ){.      TRACE((
2c530 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2c540 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
2c550 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
2c560 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2c570 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
2c580 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2c590 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
2c5a0 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
2c5b0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2c5c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2c5d0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2c5e0 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2c5f0 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2c600 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2c610 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
2c620 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
2c630 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
2c640 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
2c650 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c660 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2c670 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
2c680 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
2c690 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2c6a0 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
2c6b0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Bt) );.      if(
2c6c0 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
2c6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c6e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c6f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c710 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  {.      rc = ins
2c720 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2c730 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
2c740 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
2c750 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pCell, 0);.    }
2c760 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c780 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2c790 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
2c7a0 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e   pCur->idx), pgn
2c7b0 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72  oChild);.      r
2c7c0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2c7d0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
2c7e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c7f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70  OK ){.      drop
2c800 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
2c810 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c  ge, leafCur.idx,
2c820 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   szNext);.      
2c830 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
2c840 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
2c850 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2c860 46 72 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a  Free(tempCell);.
2c870 20 20 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43      releaseTempC
2c880 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2c890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2c8a0 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2c8b0 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2c8c0 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2c8d0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2c8e0 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2c8f0 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2c900 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2c910 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2c920 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2c930 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c940 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pPage, 0);.  }.
2c950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c960 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2c970 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2c980 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c990 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2c9a0 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
2c9b0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2c9c0 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
2c9d0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2c9e0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2c9f0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
2ca00 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
2ca10 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
2ca20 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
2ca30 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
2ca40 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
2ca50 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
2ca60 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2ca70 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
2ca80 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
2ca90 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
2caa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
2cab0 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
2cac0 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
2cad0 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
2cae0 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
2caf0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
2cb00 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
2cb10 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
2cb20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69  SQL indices.*/.i
2cb30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2cb40 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2cb50 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2cb60 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2cb70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2cb80 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
2cb90 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
2cba0 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
2cbb0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d  t rc;.  if( pBt-
2cbc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2cbd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2cbe0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2cbf0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
2cc00 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  irst */.    retu
2cc10 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2cc20 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2cc30 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2cc40 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2cc50 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2cc60 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69  );..  /* It is i
2cc70 6c 6c 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65  llegal to create
2cc80 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
2cc90 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
2cca0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
2ccb0 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
2ccc0 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
2ccd0 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
2cce0 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
2ccf0 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64  need to move a d
2cd00 61 74 61 62 61 73 65 20 70 61 67 65 20 74 6f 20  atabase page to 
2cd10 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2cd20 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e  e new root-page.
2cd30 0a 20 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e  .  ** If an open
2cd40 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
2cd50 67 20 74 68 65 20 70 61 67 65 20 61 20 70 72 6f  g the page a pro
2cd60 62 6c 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72  blem would occur
2cd70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2cd80 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2cd90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2cda0 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64  OCKED;.  }..#ifd
2cdb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2cdc0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d  UTOVACUUM.  rc =
2cdd0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2cde0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
2cdf0 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
2ce00 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2ce10 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20  urn rc;.#else.  
2ce20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2ce30 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
2ce40 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
2ce50 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
2ce60 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
2ce70 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2ce80 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
2ce90 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
2cea0 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
2ceb0 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
2cec0 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
2ced0 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
2cee0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
2cef0 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
2cf00 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
2cf10 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2cf20 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
2cf30 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
2cf40 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2cf50 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2cf60 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
2cf70 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
2cf80 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
2cf90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2cfa0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2cfb0 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74  (p, 4, &pgnoRoot
2cfc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2cfd0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2cfe0 6e 20 72 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f  n rc;.    pgnoRo
2cff0 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ot++;..    /* Th
2d000 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
2d010 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  may not be alloc
2d020 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65  ated on a pointe
2d030 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r-map page, or t
2d040 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  he.    ** PENDIN
2d050 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20  G_BYTE page..   
2d060 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2d070 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Root==PTRMAP_PAG
2d080 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  ENO(pBt, pgnoRoo
2d090 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67  t) ||.        pg
2d0a0 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f  noRoot==PENDING_
2d0b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2d0c0 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74  {.      pgnoRoot
2d0d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
2d0e0 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d  sert( pgnoRoot>=
2d0f0 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  3 );..    /* All
2d100 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68  ocate a page. Th
2d110 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72  e page that curr
2d120 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74  ently resides at
2d130 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20   pgnoRoot will. 
2d140 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74     ** be moved t
2d150 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2d160 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65  page (unless the
2d170 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2d180 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74  happens.    ** t
2d190 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f  o reside at pgno
2d1a0 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Root)..    */.  
2d1b0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2d1c0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2d1d0 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d  PageMove, &pgnoM
2d1e0 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31  ove, pgnoRoot, 1
2d1f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d220 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   }..    if( pgno
2d230 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Move!=pgnoRoot )
2d240 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52  {.      /* pgnoR
2d250 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20  oot is the page 
2d260 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
2d270 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
2d280 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  age of.      ** 
2d290 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61  the new table (a
2d2a0 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72  ssuming an error
2d2b0 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e   did not occur).
2d2c0 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20   But we were.   
2d2d0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
2d2e0 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71  pgnoMove. If req
2d2f0 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69  uired (i.e. if i
2d300 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  t was not alloca
2d310 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  ted.      ** by 
2d320 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69  extending the fi
2d330 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74  le), the current
2d340 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f   page at positio
2d350 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20  n pgnoMove.     
2d360 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a   ** is already j
2d370 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20  ournaled..      
2d380 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  */.      u8 eTyp
2d390 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50  e;.      Pgno iP
2d3a0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72  trPage;..      r
2d3b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2d3c0 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Move);..      /*
2d3d0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63   Move the page c
2d3e0 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f  urrently at pgno
2d3f0 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65  Root to pgnoMove
2d400 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2d410 67 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  getPage(pBt, pgn
2d420 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
2d430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d450 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2d470 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2d480 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54  t, pgnoRoot, &eT
2d490 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
2d4a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2d4b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70  QLITE_OK || eTyp
2d4c0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
2d4d0 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  GE || eType==PTR
2d4e0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
2d4f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d500 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2d510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2d530 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2d540 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
2d550 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2d560 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe!=PTRMAP_FREEP
2d570 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  AGE );.      rc 
2d580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d590 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
2d5a0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2d5b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d5c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d5d0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2d5e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2d600 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
2d610 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65  Bt, pRoot, eType
2d620 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f  , iPtrPage, pgno
2d630 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c  Move);.      rel
2d640 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2d650 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  ..      /* Obtai
2d660 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67  n the page at pg
2d670 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  noRoot */.      
2d680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2d6a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2d6b0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
2d6c0 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
2d6d0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
2d6e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d6f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d710 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2d720 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d730 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2d740 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d760 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d770 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2d780 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d790 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2d7a0 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61       pRoot = pPa
2d7b0 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a  geMove;.    } ..
2d7c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2d7d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e  e pointer-map an
2d7e0 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68  d meta-data with
2d7f0 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
2d800 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
2d810 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2d820 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2d830 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
2d840 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2d850 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2d860 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2d870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d880 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2d890 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2d8a0 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f  eta(p, 4, pgnoRo
2d8b0 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ot);.    if( rc 
2d8c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2d8d0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2d8e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d8f0 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
2d900 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2d910 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2d920 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2d930 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
2d940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d950 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
2d960 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2d970 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
2d980 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
2d990 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
2d9a0 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45  , flags | PTF_LE
2d9b0 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  AF);.  sqlite3Pa
2d9c0 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e  gerUnref(pRoot->
2d9d0 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54  pDbPage);.  *piT
2d9e0 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f  able = (int)pgno
2d9f0 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  Root;.  return S
2da00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2da10 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76  ** Erase the giv
2da20 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
2da30 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69   and all its chi
2da40 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a  ldren.  Return.*
2da50 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  * the page to th
2da60 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73  e freelist..*/.s
2da70 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44  tatic int clearD
2da80 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42  atabasePage(.  B
2da90 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2daa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2dab0 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69  Tree that contai
2dac0 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ns the table */.
2dad0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
2dae0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2daf0 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20  number to clear 
2db00 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2db10 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61  arent,     /* Pa
2db20 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c  rent page.  NULL
2db30 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f   for the root */
2db40 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
2db50 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag      /* Deal
2db60 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
2db70 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  rue */.){.  MemP
2db80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2db90 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
2dba0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2dbb0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
2dbc0 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  ( pgno>sqlite3Pa
2dbd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
2dbe0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2dbf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2dc00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2dc10 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
2dc20 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2dc30 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
2dc40 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
2dc50 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2dc60 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
2dc70 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2dc80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2dc90 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2dca0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
2dcb0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2dcc0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2dcd0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2dce0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2dcf0 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
2dd00 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2dd10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2dd20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2dd30 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2dd40 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2dd50 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2dd60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2dd70 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2dd80 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2dd90 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2dda0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2ddb0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2ddc0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2ddd0 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
2dde0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2ddf0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2de00 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2de10 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2de20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
2de30 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
2de40 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2de50 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
2de60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2de70 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2de80 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65  e))==0 ){.    ze
2de90 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
2dea0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
2deb0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
2dec0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2ded0 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
2dee0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2def0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2df00 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
2df10 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
2df20 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2df30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2df40 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
2df50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2df60 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2df70 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
2df80 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2df90 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
2dfa0 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
2dfb0 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
2dfc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2dfd0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2dfe0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2dff0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2e000 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
2e010 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2e020 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
2e030 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
2e040 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
2e050 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
2e060 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2e070 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
2e080 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2e090 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
2e0a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2e0b0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
2e0c0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2e0d0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
2e0e0 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
2e0f0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2e100 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2e110 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
2e120 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2e130 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
2e140 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2e150 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2e160 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
2e170 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73  tion of all curs
2e180 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
2e190 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2e1a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2e1b0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2e1c0 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2e1d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e1e0 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
2e1f0 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2e200 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2e210 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  able, 0, 0);.}..
2e220 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2e230 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2e240 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2e250 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2e260 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2e270 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2e280 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2e290 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2e2a0 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2e2b0 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2e2c0 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2e2d0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2e2e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2e2f0 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2e300 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2e310 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2e320 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2e330 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2e340 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2e350 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2e360 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2e370 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2e380 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2e390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2e3a0 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2e3b0 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2e3c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e3d0 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2e3e0 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2e3f0 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2e400 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2e410 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2e420 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2e430 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2e440 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2e450 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2e460 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2e470 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2e480 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2e490 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2e4a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2e4b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e4c0 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2e4d0 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2e4e0 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2e4f0 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2e500 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2e510 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2e520 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2e530 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2e540 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2e550 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2e560 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2e570 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2e580 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2e590 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2e5a0 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2e5b0 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2e5c0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2e5d0 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2e5e0 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2e5f0 64 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dure..*/.int sql
2e600 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2e610 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2e620 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2e630 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2e640 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2e650 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2e660 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2e670 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
2e680 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2e690 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2e6a0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2e6b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2e6c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2e6d0 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69   }..  /* It is i
2e6e0 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61  llegal to drop a
2e6f0 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2e700 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2e710 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2e720 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2e730 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2e740 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2e750 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2e760 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68  ed to move anoth
2e770 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  er root-page to 
2e780 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20  fill a gap left 
2e790 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20  by the deleted. 
2e7a0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49   ** root page. I
2e7b0 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  f an open cursor
2e7c0 20 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20   was using this 
2e7d0 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77  page a problem w
2e7e0 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72  ould .  ** occur
2e7f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2e800 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
2e810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2e820 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63  OCKED;.  }..  rc
2e830 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2e840 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70  (Pgno)iTable, &p
2e850 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
2e860 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2e870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e880 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c  reeClearTable(p,
2e890 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   iTable);.  if( 
2e8a0 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  rc ){.    releas
2e8b0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e8d0 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30  ..  *piMoved = 0
2e8e0 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e  ;..  if( iTable>
2e8f0 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 ){.#ifdef SQLI
2e900 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e910 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  UM.    rc = free
2e920 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2e930 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2e940 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ge);.#else.    i
2e950 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2e960 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  um ){.      Pgno
2e970 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
2e980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e990 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2e9a0 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
2e9b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2e9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e9d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e9e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2e9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ea00 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
2ea10 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
2ea20 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
2ea30 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
2ea40 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
2ea50 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
2ea60 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
2ea70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2ea80 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
2ea90 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
2eaa0 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
2eab0 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
2eac0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
2ead0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2eae0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
2eaf0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2eb00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2eb10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2eb20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2eb30 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2eb40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb50 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
2eb60 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
2eb70 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
2eb80 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2eb90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
2eba0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2ebb0 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
2ebc0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
2ebd0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
2ebe0 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
2ebf0 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
2ec00 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
2ec10 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
2ec20 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
2ec30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2ec40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
2ec50 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
2ec60 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
2ec70 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
2ec80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ec90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2eca0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ecb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2ecc0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
2ecd0 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41  Bt, pMove, PTRMA
2ece0 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69  P_ROOTPAGE, 0, i
2ecf0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
2ed00 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
2ed10 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2ed20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ed30 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2ed40 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2ed50 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
2ed60 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2ed70 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2ed80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ed90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2eda0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2edb0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2edc0 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2edd0 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2ede0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2edf0 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2ee00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ee10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ee20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ee30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
2ee40 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
2ee50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
2ee60 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
2ee70 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
2ee80 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
2ee90 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
2eea0 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
2eeb0 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
2eec0 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
2eed0 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
2eee0 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
2eef0 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
2ef00 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
2ef10 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
2ef20 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
2ef30 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
2ef40 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
2ef50 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2ef60 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
2ef70 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
2ef80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ef90 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2efa0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2efb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
2efc0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
2efd0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
2efe0 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
2eff0 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
2f000 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
2f010 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
2f020 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
2f030 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2f040 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
2f050 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2f060 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
2f070 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
2f080 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
2f090 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2f0a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f0b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  (pPage);.    }.#
2f0c0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
2f0d0 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
2f0e0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77  BtreeDropTable w
2f0f0 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  as called on pag
2f100 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f  e 1. */.    zero
2f110 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f  Page(pPage, PTF_
2f120 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20  INTKEY|PTF_LEAF 
2f130 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2f140 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
2f150 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
2f160 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
2f170 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
2f180 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62  n out of a datab
2f190 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b  ase file.  Meta[
2f1a0 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  0].** is the num
2f1b0 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
2f1c0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
2f1d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
2f1e0 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68  ta[1].** through
2f1f0 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76   meta[15] are av
2f200 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
2f210 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  by higher layers
2f220 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
2f230 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20   read-only, the 
2f240 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f  others are read/
2f250 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  write..** .** Th
2f260 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e  e schema layer n
2f270 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75  umbers meta valu
2f280 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20  es differently. 
2f290 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   At the schema.*
2f2a0 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65  * layer (and the
2f2b0 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52   SetCookie and R
2f2c0 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65  eadCookie opcode
2f2d0 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s) the number of
2f2e0 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
2f2f0 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20  s not visible.  
2f300 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20  So Cookie[0] is 
2f310 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61  the same as Meta
2f320 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  [1]..*/.int sqli
2f330 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2f340 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
2f350 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a  x, u32 *pMeta){.
2f360 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2f370 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  e;.  int rc;.  u
2f380 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2f390 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
2f3a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
2f3b0 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
2f3c0 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
2f3d0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
2f3e0 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
2f3f0 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
2f400 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
2f410 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
2f420 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
2f430 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
2f440 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
2f450 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2f460 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
2f470 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
2f480 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
2f490 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
2f4a0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
2f4b0 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2f4c0 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
2f4d0 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
2f4e0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
2f4f0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
2f500 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2f510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
2f520 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
2f530 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2f540 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20  idx<=15 );.  rc 
2f550 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f560 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31  t(pBt->pPager, 1
2f570 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
2f580 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2f590 63 3b 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69  c;.  pP1 = (unsi
2f5a0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
2f5b0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2f5c0 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65  pDbPage);.  *pMe
2f5d0 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ta = get4byte(&p
2f5e0 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b  P1[36 + idx*4]);
2f5f0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2f600 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a  nref(pDbPage);..
2f610 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75    /* If autovacu
2f620 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64  umed is disabled
2f630 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62   in this build b
2f640 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  ut we are trying
2f650 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73   to .  ** access
2f660 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64   an autovacuumed
2f670 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
2f680 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73  make the databas
2f690 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a  e readonly. .  *
2f6a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2f6b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2f6c0 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20    if( idx==4 && 
2f6d0 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e  *pMeta>0 ) pBt->
2f6e0 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65  readOnly = 1;.#e
2f6f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20  ndif..  /* Grab 
2f700 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  the read-lock on
2f710 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63   page 1. */.  rc
2f720 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20   = lockTable(p, 
2f730 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
2f740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f750 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d  *.** Write meta-
2f760 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b  information back
2f770 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
2f780 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a  se.  Meta[0] is.
2f790 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  ** read-only and
2f7a0 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74   may not be writ
2f7b0 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ten..*/.int sqli
2f7c0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2f7d0 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
2f7e0 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29   idx, u32 iMeta)
2f7f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2f800 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
2f810 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
2f820 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
2f830 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20  sert( idx>=1 && 
2f840 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28  idx<=15 );.  if(
2f850 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
2f860 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2f870 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
2f880 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2f890 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2f8a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73  ERROR;.  }.  ass
2f8b0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
2f8c0 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70  !=0 );.  pP1 = p
2f8d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2f8e0 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
2f8f0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
2f900 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
2f910 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2f920 74 75 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62  turn rc;.  put4b
2f930 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
2f940 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20  x*4], iMeta);.  
2f950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2f970 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20  n the flag byte 
2f980 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2f990 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2f9a0 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
2f9b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2f9c0 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
2f9d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
2f9e0 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
2f9f0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2fa00 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52  hat about CURSOR
2fa10 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2fa20 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65  te? Probably nee
2fa30 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72  d to call.  ** r
2fa40 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2fa50 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65  sorPosition() he
2fa60 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61  re..  */.  MemPa
2fa70 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2fa80 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  ->pPage;.  retur
2fa90 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
2faa0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2fab0 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
2fac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2fad0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
2fae0 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f   a disassembly o
2faf0 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
2fb00 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74   on standard out
2fb10 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
2fb20 6e 65 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f  ne.** is used fo
2fb30 72 20 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20  r debugging and 
2fb40 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  testing only..*/
2fb50 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2fb60 65 50 61 67 65 44 75 6d 70 28 42 74 53 68 61 72  ePageDump(BtShar
2fb70 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e  ed *pBt, int pgn
2fb80 6f 2c 20 69 6e 74 20 72 65 63 75 72 73 69 76 65  o, int recursive
2fb90 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  , MemPage *pPare
2fba0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
2fbb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2fbc0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a  .  int i, j, c;.
2fbd0 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75    int nFree;.  u
2fbe0 31 36 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64  16 idx;.  int hd
2fbf0 72 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  r;.  int nCell;.
2fc00 20 20 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20    int isInit;.  
2fc10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
2fc20 61 74 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67  ata;.  char rang
2fc30 65 5b 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65  e[20];.  unsigne
2fc40 64 20 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32  d char payload[2
2fc50 30 5d 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50  0];..  rc = getP
2fc60 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70  age(pBt, (Pgno)p
2fc70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  gno, &pPage, 0);
2fc80 0a 20 20 69 73 49 6e 69 74 20 3d 20 70 50 61 67  .  isInit = pPag
2fc90 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66 28  e->isInit;.  if(
2fca0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
2fcb0 30 20 29 7b 0a 20 20 20 20 69 6e 69 74 50 61 67  0 ){.    initPag
2fcc0 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  e(pPage, pParent
2fcd0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  );.  }.  if( rc 
2fce0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2fcf0 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
2fd00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2fd10 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2fd20 61 44 61 74 61 3b 0a 20 20 63 20 3d 20 64 61 74  aData;.  c = dat
2fd30 61 5b 68 64 72 5d 3b 0a 20 20 70 50 61 67 65 2d  a[hdr];.  pPage-
2fd40 3e 69 6e 74 4b 65 79 20 3d 20 28 63 20 26 20 28  >intKey = (c & (
2fd50 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2fd60 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20  EAFDATA))!=0;.  
2fd70 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
2fd80 3d 20 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44  = (c & PTF_ZEROD
2fd90 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  ATA)!=0;.  pPage
2fda0 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 28 63 20  ->leafData = (c 
2fdb0 26 20 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21  & PTF_LEAFDATA)!
2fdc0 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
2fdd0 66 20 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41  f = (c & PTF_LEA
2fde0 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  F)!=0;.  pPage->
2fdf0 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67  hasData = !(pPag
2fe00 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28  e->zeroData || (
2fe10 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20  !pPage->leaf && 
2fe20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29  pPage->leafData)
2fe30 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  );.  nCell = get
2fe40 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2fe50 33 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  3]);.  sqlite3De
2fe60 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
2fe70 25 64 3a 20 20 66 6c 61 67 73 3d 30 78 25 30 32  %d:  flags=0x%02
2fe80 78 20 20 66 72 61 67 3d 25 64 20 20 20 70 61 72  x  frag=%d   par
2fe90 65 6e 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c  ent=%d\n", pgno,
2fea0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 5d 2c 20  .    data[hdr], 
2feb0 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20 20  data[hdr+7], .  
2fec0 20 20 28 70 50 61 67 65 2d 3e 69 73 49 6e 69 74    (pPage->isInit
2fed0 20 26 26 20 70 50 61 67 65 2d 3e 70 50 61 72 65   && pPage->pPare
2fee0 6e 74 29 20 3f 20 70 50 61 67 65 2d 3e 70 50 61  nt) ? pPage->pPa
2fef0 72 65 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b  rent->pgno : 0);
2ff00 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 20 3d  .  assert( hdr =
2ff10 3d 20 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  = (pgno==1 ? 100
2ff20 20 3a 20 30 29 20 29 3b 0a 20 20 69 64 78 20 3d   : 0) );.  idx =
2ff30 20 68 64 72 20 2b 20 31 32 20 2d 20 70 50 61 67   hdr + 12 - pPag
2ff40 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f 72  e->leaf*4;.  for
2ff50 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
2ff60 2b 2b 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ++){.    CellInf
2ff70 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e 6f  o info;.    Pgno
2ff80 20 63 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73 69   child;.    unsi
2ff90 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2ffa0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20  ;.    int sz;.  
2ffb0 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
2ffc0 20 61 64 64 72 20 3d 20 67 65 74 32 62 79 74 65   addr = get2byte
2ffd0 28 26 64 61 74 61 5b 69 64 78 20 2b 20 32 2a 69  (&data[idx + 2*i
2ffe0 5d 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  ]);.    pCell = 
2fff0 26 64 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20 20  &data[addr];.   
30000 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50   parseCellPtr(pP
30010 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
30020 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66  o);.    sz = inf
30030 6f 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70 72  o.nSize;.    spr
30040 69 6e 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e  intf(range,"%d..
30050 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64 72 2b  %d", addr, addr+
30060 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70  sz-1);.    if( p
30070 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
30080 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a 20      child = 0;. 
30090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
300a0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
300b0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  (pCell);.    }. 
300c0 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61     sz = info.nDa
300d0 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  ta;.    if( !pPa
300e0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20  ge->intKey ) sz 
300f0 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  += info.nKey;.  
30100 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66 28    if( sz>sizeof(
30110 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a 20  payload)-1 ) sz 
30120 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64  = sizeof(payload
30130 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  )-1;.    memcpy(
30140 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c 5b  payload, &pCell[
30150 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20 73  info.nHeader], s
30160 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  z);.    for(j=0;
30170 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<sz; j++){.   
30180 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 5b 6a     if( payload[j
30190 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f 61  ]<0x20 || payloa
301a0 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61 79 6c  d[j]>0x7f ) payl
301b0 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20  oad[j] = '.';.  
301c0 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64 5b    }.    payload[
301d0 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  sz] = 0;.    sql
301e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
301f0 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25 32 64  .      "cell %2d
30200 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d 25  : i=%-10s chld=%
30210 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64  -4d nk=%-4lld nd
30220 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25 73  =%-4d payload=%s
30230 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20 72 61  \n",.      i, ra
30240 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66 6f  nge, child, info
30250 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61 74  .nKey, info.nDat
30260 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 29  a, payload.    )
30270 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
30280 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30290 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
302a0 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c 64 3a  tf("right_child:
302b0 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79 74 65   %d\n", get4byte
302c0 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 29 3b  (&data[hdr+8]));
302d0 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30  .  }.  nFree = 0
302e0 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  i = 0;.  idx
302f0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
30300 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69  a[hdr+1]);.  whi
30310 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78  le( idx>0 && idx
30320 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
30330 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  bleSize ){.    i
30340 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
30350 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b 0a  (&data[idx+2]);.
30360 20 20 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67      sprintf(rang
30370 65 2c 22 25 64 2e 2e 25 64 22 2c 20 69 64 78 2c  e,"%d..%d", idx,
30380 20 69 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20 20   idx+sz-1);.    
30390 6e 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  nFree += sz;.   
303a0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
303b0 6e 74 66 28 22 66 72 65 65 62 6c 6f 63 6b 20 25  ntf("freeblock %
303c0 32 64 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a 65  2d: i=%-10s size
303d0 3d 25 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-4d total=%d\n
303e0 22 2c 0a 20 20 20 20 20 20 20 69 2c 20 72 61 6e  ",.       i, ran
303f0 67 65 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b 0a  ge, sz, nFree);.
30400 20 20 20 20 69 64 78 20 3d 20 67 65 74 32 62 79      idx = get2by
30410 74 65 28 26 64 61 74 61 5b 69 64 78 5d 29 3b 0a  te(&data[idx]);.
30420 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69      i++;.  }.  i
30430 66 28 20 69 64 78 21 3d 30 20 29 7b 0a 20 20 20  f( idx!=0 ){.   
30440 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
30450 6e 74 66 28 22 45 52 52 4f 52 3a 20 6e 65 78 74  ntf("ERROR: next
30460 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65 78   freeblock index
30470 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25   out of range: %
30480 64 5c 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d 0a  d\n", idx);.  }.
30490 20 20 69 66 28 20 72 65 63 75 72 73 69 76 65 20    if( recursive 
304a0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
304b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
304c0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
304d0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
304e0 61 72 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ar *pCell = find
304f0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
30500 20 20 20 20 20 20 62 74 72 65 65 50 61 67 65 44        btreePageD
30510 75 6d 70 28 70 42 74 2c 20 67 65 74 34 62 79 74  ump(pBt, get4byt
30520 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50 61  e(pCell), 1, pPa
30530 67 65 29 3b 0a 20 20 20 20 20 20 69 64 78 20 3d  ge);.      idx =
30540 20 67 65 74 32 62 79 74 65 28 70 43 65 6c 6c 29   get2byte(pCell)
30550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
30560 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67  ePageDump(pBt, g
30570 65 74 34 62 79 74 65 28 26 64 61 74 61 5b 68 64  et4byte(&data[hd
30580 72 2b 38 5d 29 2c 20 31 2c 20 70 50 61 67 65 29  r+8]), 1, pPage)
30590 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69  ;.  }.  pPage->i
305a0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b 0a  sInit = isInit;.
305b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
305c0 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
305d0 67 65 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  ge);.  fflush(st
305e0 64 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  dout);.  return 
305f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
30600 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
30610 65 44 75 6d 70 28 42 74 72 65 65 20 2a 70 2c 20  eDump(Btree *p, 
30620 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65  int pgno, int re
30630 63 75 72 73 69 76 65 29 7b 0a 20 20 72 65 74 75  cursive){.  retu
30640 72 6e 20 62 74 72 65 65 50 61 67 65 44 75 6d 70  rn btreePageDump
30650 28 70 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 72  (p->pBt, pgno, r
30660 65 63 75 72 73 69 76 65 2c 20 30 29 3b 0a 7d 0a  ecursive, 0);.}.
30670 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
30680 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
30690 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
306a0 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
306b0 46 69 6c 6c 20 61 52 65 73 75 6c 74 5b 5d 20 77  Fill aResult[] w
306c0 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ith information 
306d0 61 62 6f 75 74 20 74 68 65 20 65 6e 74 72 79 20  about the entry 
306e0 61 6e 64 20 70 61 67 65 20 74 68 61 74 20 74 68  and page that th
306f0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 70  e.** cursor is p
30700 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a 20 0a  ointing to..** .
30710 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 30 5d 20  **   aResult[0] 
30720 3d 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  =  The page numb
30730 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  er.**   aResult[
30740 31 5d 20 3d 20 20 54 68 65 20 65 6e 74 72 79 20  1] =  The entry 
30750 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73  number.**   aRes
30760 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74 61 6c 20  ult[2] =  Total 
30770 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
30780 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a  s on this page.*
30790 2a 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d  *   aResult[3] =
307a0 20 20 43 65 6c 6c 20 73 69 7a 65 20 28 6c 6f 63    Cell size (loc
307b0 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20 68 65 61  al payload + hea
307c0 64 65 72 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c  der).**   aResul
307d0 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f  t[4] =  Number o
307e0 66 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20  f free bytes on 
307f0 74 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61  this page.**   a
30800 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20 4e 75 6d  Result[5] =  Num
30810 62 65 72 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  ber of free bloc
30820 6b 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ks on the page.*
30830 2a 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d  *   aResult[6] =
30840 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20    Total payload 
30850 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b 20 6f 76  size (local + ov
30860 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20 61 52 65  erflow).**   aRe
30870 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65 61 64 65  sult[7] =  Heade
30880 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  r size in bytes.
30890 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20  **   aResult[8] 
308a0 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  =  Local payload
308b0 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52 65 73 75   size.**   aResu
308c0 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65 6e 74 20  lt[9] =  Parent 
308d0 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  page number.**  
308e0 20 61 52 65 73 75 6c 74 5b 31 30 5d 3d 20 20 50   aResult[10]=  P
308f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
30900 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
30910 20 70 61 67 65 0a 2a 2a 0a 2a 2a 20 54 68 69 73   page.**.** This
30920 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
30930 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
30940 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
30950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
30960 74 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42  treeCursorInfo(B
30970 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30980 6e 74 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74  nt *aResult, int
30990 20 75 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63   upCnt){.  int c
309a0 6e 74 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  nt, idx;.  MemPa
309b0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
309c0 2d 3e 70 50 61 67 65 3b 0a 20 20 42 74 43 75 72  ->pPage;.  BtCur
309d0 73 6f 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69  sor tmpCur;..  i
309e0 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
309f0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
30a00 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
30a10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30a20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
30a30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
30a40 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
30a50 3b 0a 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f  ;.  getTempCurso
30a60 72 28 70 43 75 72 2c 20 26 74 6d 70 43 75 72 29  r(pCur, &tmpCur)
30a70 3b 0a 20 20 77 68 69 6c 65 28 20 75 70 43 6e 74  ;.  while( upCnt
30a80 2d 2d 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  -- ){.    moveTo
30a90 50 61 72 65 6e 74 28 26 74 6d 70 43 75 72 29 3b  Parent(&tmpCur);
30aa0 0a 20 20 7d 0a 20 20 70 50 61 67 65 20 3d 20 74  .  }.  pPage = t
30ab0 6d 70 43 75 72 2e 70 50 61 67 65 3b 0a 20 20 61  mpCur.pPage;.  a
30ac0 52 65 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69  Result[0] = sqli
30ad0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
30ae0 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
30af0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52  e);.  assert( aR
30b00 65 73 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d  esult[0]==pPage-
30b10 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75  >pgno );.  aResu
30b20 6c 74 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69  lt[1] = tmpCur.i
30b30 64 78 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d  dx;.  aResult[2]
30b40 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
30b50 0a 20 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64  .  if( tmpCur.id
30b60 78 3e 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69  x>=0 && tmpCur.i
30b70 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
30b80 29 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  ){.    getCellIn
30b90 66 6f 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20  fo(&tmpCur);.   
30ba0 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d   aResult[3] = tm
30bb0 70 43 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b  pCur.info.nSize;
30bc0 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20  .    aResult[6] 
30bd0 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44  = tmpCur.info.nD
30be0 61 74 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  ata;.    aResult
30bf0 5b 37 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66  [7] = tmpCur.inf
30c00 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61  o.nHeader;.    a
30c10 52 65 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43  Result[8] = tmpC
30c20 75 72 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  ur.info.nLocal;.
30c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
30c40 73 75 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20  sult[3] = 0;.   
30c50 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b   aResult[6] = 0;
30c60 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20  .    aResult[7] 
30c70 3d 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74  = 0;.    aResult
30c80 5b 38 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  [8] = 0;.  }.  a
30c90 52 65 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67  Result[4] = pPag
30ca0 65 2d 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20  e->nFree;.  cnt 
30cb0 3d 20 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  = 0;.  idx = get
30cc0 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
30cd0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
30ce0 66 73 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c  fset+1]);.  whil
30cf0 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c  e( idx>0 && idx<
30d00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
30d10 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e  leSize ){.    cn
30d20 74 2b 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67  t++;.    idx = g
30d30 65 74 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et2byte(&pPage->
30d40 61 44 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d  aData[idx]);.  }
30d50 0a 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20  .  aResult[5] = 
30d60 63 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  cnt;.  if( pPage
30d70 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20  ->pParent==0 || 
30d80 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
30d90 29 20 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74  ) ){.    aResult
30da0 5b 39 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  [9] = 0;.  }else
30db0 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d  {.    aResult[9]
30dc0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
30dd0 74 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 69  t->pgno;.  }.  i
30de0 66 28 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69  f( tmpCur.info.i
30df0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
30e00 61 52 65 73 75 6c 74 5b 31 30 5d 20 3d 20 67 65  aResult[10] = ge
30e10 74 34 62 79 74 65 28 26 74 6d 70 43 75 72 2e 69  t4byte(&tmpCur.i
30e20 6e 66 6f 2e 70 43 65 6c 6c 5b 74 6d 70 43 75 72  nfo.pCell[tmpCur
30e30 2e 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  .info.iOverflow]
30e40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30e50 61 52 65 73 75 6c 74 5b 31 30 5d 20 3d 20 30 3b  aResult[10] = 0;
30e60 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 54 65  .  }.  releaseTe
30e70 6d 70 43 75 72 73 6f 72 28 26 74 6d 70 43 75 72  mpCursor(&tmpCur
30e80 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
30e90 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
30ea0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30eb0 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74  e pager associat
30ec0 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e  ed with a BTree.
30ed0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
30ee0 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
30ef0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
30f00 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67  ing only..*/.Pag
30f10 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  er *sqlite3Btree
30f20 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b  Pager(Btree *p){
30f30 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
30f40 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a  ->pPager;.}../*.
30f50 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72  ** This structur
30f60 65 20 69 73 20 70 61 73 73 65 64 20 61 72 6f 75  e is passed arou
30f70 6e 64 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  nd through all t
30f80 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
30f90 6e 67 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 69  ng routines.** i
30fa0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
30fb0 74 72 61 63 6b 20 6f 66 20 73 6f 6d 65 20 67 6c  track of some gl
30fc0 6f 62 61 6c 20 73 74 61 74 65 20 69 6e 66 6f 72  obal state infor
30fd0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  mation..*/.typed
30fe0 65 66 20 73 74 72 75 63 74 20 49 6e 74 65 67 72  ef struct Integr
30ff0 69 74 79 43 6b 20 49 6e 74 65 67 72 69 74 79 43  ityCk IntegrityC
31000 6b 3b 0a 73 74 72 75 63 74 20 49 6e 74 65 67 72  k;.struct Integr
31010 69 74 79 43 6b 20 7b 0a 20 20 42 74 53 68 61 72  ityCk {.  BtShar
31020 65 64 20 2a 70 42 74 3b 20 20 20 20 2f 2a 20 54  ed *pBt;    /* T
31030 68 65 20 74 72 65 65 20 62 65 69 6e 67 20 63 68  he tree being ch
31040 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a 20 20 50  ecked out */.  P
31050 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
31060 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74   /* The associat
31070 65 64 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20  ed pager.  Also 
31080 61 63 63 65 73 73 69 62 6c 65 20 62 79 20 70 42  accessible by pB
31090 74 2d 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69  t->pPager */.  i
310a0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
310b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
310c0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
310d0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e  ase */.  int *an
310e0 52 65 66 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  Ref;       /* Nu
310f0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 65 61  mber of times ea
31100 63 68 20 70 61 67 65 20 69 73 20 72 65 66 65 72  ch page is refer
31110 65 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  enced */.  int m
31120 78 45 72 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  xErr;        /* 
31130 53 74 6f 70 20 61 63 63 75 6d 75 6c 61 74 69 6e  Stop accumulatin
31140 67 20 65 72 72 6f 72 73 20 77 68 65 6e 20 74 68  g errors when th
31150 69 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  is reaches zero 
31160 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
31170 73 67 3b 20 20 20 20 2f 2a 20 41 6e 20 65 72 72  sg;    /* An err
31180 6f 72 20 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c  or message.  NUL
31190 4c 20 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 73  L if no errors s
311a0 65 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  een. */.  int nE
311b0 72 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  rr;         /* N
311c0 75 6d 62 65 72 20 6f 66 20 6d 65 73 73 61 67 65  umber of message
311d0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 45 72  s written to zEr
311e0 72 4d 73 67 20 73 6f 20 66 61 72 20 2a 2f 0a 7d  rMsg so far */.}
311f0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
31200 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
31210 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70  _CHECK./*.** App
31220 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f  end a message to
31230 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
31240 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ge string..*/.st
31250 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
31260 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65  ppendMsg(.  Inte
31270 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
31280 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a  .  char *zMsg1,.
31290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
312a0 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a  ormat,.  ....){.
312b0 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
312c0 63 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69  char *zMsg2;.  i
312d0 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72  f( !pCheck->mxEr
312e0 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  r ) return;.  pC
312f0 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20  heck->mxErr--;. 
31300 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b   pCheck->nErr++;
31310 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
31320 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67  zFormat);.  zMsg
31330 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  2 = sqlite3VMPri
31340 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
31350 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
31360 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29    if( zMsg1==0 )
31370 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69   zMsg1 = "";.  i
31380 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  f( pCheck->zErrM
31390 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  sg ){.    char *
313a0 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a  zOld = pCheck->z
313b0 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65  ErrMsg;.    pChe
313c0 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ck->zErrMsg = 0;
313d0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
313e0 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a  tring(&pCheck->z
313f0 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c  ErrMsg, zOld, "\
31400 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32  n", zMsg1, zMsg2
31410 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
31420 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64   sqliteFree(zOld
31430 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31440 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
31450 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  (&pCheck->zErrMs
31460 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  g, zMsg1, zMsg2,
31470 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a   (char*)0);.  }.
31480 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 73    sqliteFree(zMs
31490 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  g2);.}.#endif /*
314a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
314b0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
314c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
314d0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
314e0 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31  HECK./*.** Add 1
314f0 20 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63   to the referenc
31500 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
31510 20 69 50 61 67 65 2e 20 20 49 66 20 74 68 69 73   iPage.  If this
31520 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   is the second.*
31530 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
31540 68 65 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20  he page, add an 
31550 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
31560 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
31570 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  ..** Return 1 if
31580 20 74 68 65 72 65 20 61 72 65 20 32 20 6f 72 65   there are 2 ore
31590 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73   more references
315a0 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
315b0 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73   0 if.** if this
315c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
315d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
315e0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  age..**.** Also 
315f0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
31600 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e  age number is in
31610 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74   bounds..*/.stat
31620 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28  ic int checkRef(
31630 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
31640 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20  eck, int iPage, 
31650 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b  char *zContext){
31660 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20  .  if( iPage==0 
31670 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
31680 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e  ( iPage>pCheck->
31690 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30  nPage || iPage<0
316a0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
316b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
316c0 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69  Context, "invali
316d0 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64  d page number %d
316e0 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72  ", iPage);.    r
316f0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
31700 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66  f( pCheck->anRef
31710 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20  [iPage]==1 ){.  
31720 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
31730 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
31740 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63  t, "2nd referenc
31750 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69  e to page %d", i
31760 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
31770 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
31780 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65  n  (pCheck->anRe
31790 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d  f[iPage]++)>1;.}
317a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
317b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
317c0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
317d0 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74  t the entry in t
317e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
317f0 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d  or page iChild m
31800 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20  aps to .** page 
31810 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72  iParent, pointer
31820 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49   type ptrType. I
31830 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e  f not, append an
31840 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
31850 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a  * to pCheck..*/.
31860 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
31870 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67  kPtrmap(.  Integ
31880 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
31890 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
318a0 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  heck context */.
318b0 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
318c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c           /* Chil
318d0 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  d page number */
318e0 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
318f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
31900 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
31910 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f  p type */.  Pgno
31920 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20   iParent,       
31930 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70     /* Expected p
31940 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e  ointer map paren
31950 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  t page number */
31960 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  .  char *zContex
31970 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  t         /* Con
31980 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e  text description
31990 20 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72   (used for error
319a0 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e   msg) */.){.  in
319b0 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d  t rc;.  u8 ePtrm
319c0 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69  apType;.  Pgno i
319d0 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20  PtrmapParent;.. 
319e0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
319f0 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68  pCheck->pBt, iCh
31a00 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70  ild, &ePtrmapTyp
31a10 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e  e, &iPtrmapParen
31a20 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
31a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
31a40 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31a50 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31a60 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20  "Failed to read 
31a70 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20  ptrmap key=%d", 
31a80 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  iChild);.    ret
31a90 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
31aa0 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79  ePtrmapType!=eTy
31ab0 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72  pe || iPtrmapPar
31ac0 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a  ent!=iParent ){.
31ad0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31ae0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31af0 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64  ext, .      "Bad
31b00 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b   ptr map entry k
31b10 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28  ey=%d expected=(
31b20 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25  %d,%d) got=(%d,%
31b30 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69  d)", .      iChi
31b40 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65  ld, eType, iPare
31b50 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c  nt, ePtrmapType,
31b60 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b   iPtrmapParent);
31b70 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
31b80 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69  *.** Check the i
31b90 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
31ba0 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61  freelist or of a
31bb0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
31bc0 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20  list..** Verify 
31bd0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
31be0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
31bf0 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74  list is N..*/.st
31c00 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c  atic void checkL
31c10 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79  ist(.  Integrity
31c20 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
31c30 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69  Integrity checki
31c40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
31c50 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20  int isFreeList, 
31c60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
31c70 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46  r a freelist.  F
31c80 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f  alse for overflo
31c90 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20  w page list */. 
31ca0 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
31cb0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
31cc0 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20  umber for first 
31cd0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
31ce0 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
31d00 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f  xpected number o
31d10 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  f pages in the l
31d20 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ist */.  char *z
31d30 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f  Context        /
31d40 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72  * Context for er
31d50 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
31d60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
31d70 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a  t expected = N;.
31d80 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69    int iFirst = i
31d90 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e  Page;.  while( N
31da0 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b  -- > 0 && pCheck
31db0 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44  ->mxErr ){.    D
31dc0 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65  bPage *pOvflPage
31dd0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
31de0 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a  har *pOvflData;.
31df0 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20      if( iPage<1 
31e00 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
31e10 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31e20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31e30 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67     "%d of %d pag
31e40 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  es missing from 
31e50 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74  overflow list st
31e60 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20  arting at %d",. 
31e70 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78           N+1, ex
31e80 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b  pected, iFirst);
31e90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31ea0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
31eb0 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61  kRef(pCheck, iPa
31ec0 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20  ge, zContext) ) 
31ed0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
31ee0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
31ef0 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28  Check->pPager, (
31f00 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76  Pgno)iPage, &pOv
31f10 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  flPage) ){.     
31f20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31f30 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31f40 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74  , "failed to get
31f50 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
31f60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
31f70 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44      }.    pOvflD
31f80 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
31f90 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
31fa0 67 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c  gerGetData(pOvfl
31fb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Page);.    if( i
31fc0 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20  sFreeList ){.   
31fd0 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62     int n = get4b
31fe0 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34  yte(&pOvflData[4
31ff0 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
32000 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32010 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  UM.      if( pCh
32020 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
32030 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
32040 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
32050 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  ck, iPage, PTRMA
32060 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a  P_FREEPAGE, 0, z
32070 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
32080 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
32090 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74  f( n>pCheck->pBt
320a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38  ->usableSize/4-8
320b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
320c0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
320d0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
320e0 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73          "freelis
320f0 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f  t leaf count too
32100 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22   big on page %d"
32110 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32120 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c    N--;.      }el
32130 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
32140 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
32150 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
32160 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62  FreePage = get4b
32170 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38  yte(&pOvflData[8
32180 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20  +i*4]);.#ifndef 
32190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
321a0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20  VACUUM.         
321b0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
321c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
321d0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
321e0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
321f0 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41  iFreePage, PTRMA
32200 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a  P_FREEPAGE, 0, z
32210 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
32220 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32230 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28         checkRef(
32240 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67  pCheck, iFreePag
32250 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
32260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32270 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  N -= n;.      }.
32280 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
32290 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
322a0 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20  CUUM.    else{. 
322b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
322c0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
322d0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e  s auto-vacuum an
322e0 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74  d iPage is not t
322f0 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a  he last.      **
32300 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76   page in this ov
32310 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65  erflow list, che
32320 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e  ck that the poin
32330 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
32340 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  r.      ** the f
32350 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61  ollowing page ma
32360 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20  tches iPage..   
32370 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32380 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
32390 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29  oVacuum && N>0 )
323a0 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65  {.        i = ge
323b0 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61  t4byte(pOvflData
323c0 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  );.        check
323d0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
323e0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
323f0 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  W2, iPage, zCont
32400 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ext);.      }.  
32410 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
32420 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
32430 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20  pOvflData);.    
32440 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
32450 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20  f(pOvflPage);.  
32460 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
32470 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
32480 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
32490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
324a0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
324b0 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f  K./*.** Do vario
324c0 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73  us sanity checks
324d0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67   on a single pag
324e0 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65  e of a tree.  Re
324f0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  turn.** the tree
32500 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61   depth.  Root pa
32510 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50  ges return 0.  P
32520 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70  arents of root p
32530 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31  ages.** return 1
32540 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a  , and so forth..
32550 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65  ** .** These che
32560 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a  cks are done:.**
32570 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b  .**      1.  Mak
32580 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c  e sure that cell
32590 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73  s and freeblocks
325a0 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a   do not overlap.
325b0 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20  **          but 
325c0 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c  combine to compl
325d0 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20  etely cover the 
325e0 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e  page..**  NO  2.
325f0 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c    Make sure cell
32600 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64   keys are in ord
32610 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20  er..**  NO  3.  
32620 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
32630 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
32640 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72   equal to zLower
32650 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34  Bound..**  NO  4
32660 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
32670 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74  key is greater t
32680 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
32690 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zUpperBound..** 
326a0 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74       5.  Check t
326b0 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
326c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
326d0 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75  **      6.  Recu
326e0 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65  rsively call che
326f0 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c  ckTreePage on al
32700 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20  l children..**  
32710 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74      7.  Verify t
32720 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66  hat the depth of
32730 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73   all children is
32740 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20   the same..**   
32750 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65     8.  Make sure
32760 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74   this page is at
32770 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20   least 33% full 
32780 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a  or else it is.**
32790 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f            the ro
327a0 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  ot of the tree..
327b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
327c0 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49  eckTreePage(.  I
327d0 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
327e0 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20  ck,  /* Context 
327f0 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63  for the sanity c
32800 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50  heck */.  int iP
32810 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
32820 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
32830 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68  f the page to ch
32840 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  eck */.  MemPage
32850 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
32860 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  * Parent page */
32870 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  .  char *zParent
32880 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65  Context  /* Pare
32890 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  nt context */.){
328a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
328b0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20  e;.  int i, rc, 
328c0 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c  depth, d2, pgno,
328d0 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c   cnt;.  int hdr,
328e0 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e   cellStart;.  in
328f0 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64  t nCell;.  u8 *d
32900 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
32910 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62  *pBt;.  int usab
32920 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a  leSize;.  char z
32930 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20  Context[100];.  
32940 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 70  char *hit;..  sp
32950 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20  rintf(zContext, 
32960 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61  "Page %d: ", iPa
32970 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ge);..  /* Check
32980 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65   that the page e
32990 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74  xists.  */.  pBt
329a0 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a   = pCheck->pBt;.
329b0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
329c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
329d0 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
329e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
329f0 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
32a00 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74  , iPage, zParent
32a10 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72  Context) ) retur
32a20 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  n 0;.  if( (rc =
32a30 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50   getPage(pBt, (P
32a40 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67  gno)iPage, &pPag
32a50 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
32a60 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32a70 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
32a80 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  ,.       "unable
32a90 20 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65   to get the page
32aa0 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22  . error code=%d"
32ab0 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  , rc);.    retur
32ac0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
32ad0 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50  rc = initPage(pP
32ae0 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d  age, pParent))!=
32af0 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
32b00 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32b10 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 69 74 50  zContext, "initP
32b20 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
32b30 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
32b40 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
32b50 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
32b60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
32b70 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
32b80 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
32b90 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
32ba0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
32bb0 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
32bc0 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
32bd0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
32be0 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43     int sz;.    C
32bf0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
32c00 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
32c10 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
32c20 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 70  es.    */.    sp
32c30 72 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20  rintf(zContext, 
32c40 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64  "On tree page %d
32c50 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61   cell %d: ", iPa
32c60 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c  ge, i);.    pCel
32c70 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
32c80 67 65 2c 69 29 3b 0a 20 20 20 20 70 61 72 73 65  ge,i);.    parse
32c90 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
32ca0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
32cb0 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74    sz = info.nDat
32cc0 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  a;.    if( !pPag
32cd0 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b  e->intKey ) sz +
32ce0 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  = info.nKey;.   
32cf0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66   assert( sz==inf
32d00 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
32d10 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c    if( sz>info.nL
32d20 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocal ){.      in
32d30 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20  t nPage = (sz - 
32d40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73  info.nLocal + us
32d50 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75  ableSize - 5)/(u
32d60 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
32d70 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
32d80 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
32d90 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
32da0 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20  flow]);.#ifndef 
32db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32dc0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
32dd0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32de0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
32df0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
32e00 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
32e10 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67  _OVERFLOW1, iPag
32e20 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
32e30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32e40 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68     checkList(pCh
32e50 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c  eck, 0, pgnoOvfl
32e60 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , nPage, zContex
32e70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
32e80 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f  * Check sanity o
32e90 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  f left child pag
32ea0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
32eb0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
32ec0 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  {.      pgno = g
32ed0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
32ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32ef0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32f00 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
32f10 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
32f20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
32f30 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
32f40 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
32f50 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
32f60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32f70 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65     d2 = checkTre
32f80 65 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e  ePage(pCheck,pgn
32f90 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74  o,pPage,zContext
32fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30  );.      if( i>0
32fb0 20 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b   && d2!=depth ){
32fc0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
32fd0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32fe0 7a 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64  zContext, "Child
32ff0 20 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66   page depth diff
33000 65 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers");.      }. 
33010 20 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b       depth = d2;
33020 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
33030 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
33040 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
33050 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
33060 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
33070 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 70 72  set+8]);.    spr
33080 69 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22  intf(zContext, "
33090 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69  On page %d at ri
330a0 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50  ght child: ", iP
330b0 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
330c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
330d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
330e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
330f0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
33100 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
33110 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
33120 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  age, 0);.    }.#
33130 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
33140 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20  reePage(pCheck, 
33150 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f  pgno, pPage, zCo
33160 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20  ntext);.  }. .  
33170 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d  /* Check for com
33180 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f  plete coverage o
33190 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a  f the page.  */.
331a0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
331b0 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
331c0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
331d0 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 4d  .  hit = sqliteM
331e0 61 6c 6c 6f 63 28 20 75 73 61 62 6c 65 53 69 7a  alloc( usableSiz
331f0 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29  e );.  if( hit )
33200 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  {.    memset(hit
33210 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64  , 1, get2byte(&d
33220 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20  ata[hdr+5]));.  
33230 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
33240 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
33250 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20  ;.    cellStart 
33260 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
33270 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
33280 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
33290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
332a0 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
332b0 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b  &data[cellStart+
332c0 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i*2]);.      int
332d0 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
332e0 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
332f0 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  [pc]);.      int
33300 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   j;.      if( (p
33310 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  c+size-1)>=usabl
33320 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b  eSize || pc<0 ){
33330 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
33340 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33350 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
33360 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
33370 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
33380 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
33390 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
333a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
333b0 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e  (j=pc+size-1; j>
333c0 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  =pc; j--) hit[j]
333d0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
333e0 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c  }.    for(cnt=0,
333f0 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74   i=get2byte(&dat
33400 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26  a[hdr+1]); i>0 &
33410 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26  & i<usableSize &
33420 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20  & cnt<10000; .  
33430 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b           cnt++){
33440 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
33450 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
33460 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  [i+2]);.      in
33470 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
33480 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  i+size-1)>=usabl
33490 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a  eSize || i<0 ){.
334a0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
334b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
334c0 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
334d0 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
334e0 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
334f0 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
33500 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
33510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
33520 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  (j=i+size-1; j>=
33530 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  i; j--) hit[j]++
33540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33550 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  i = get2byte(&da
33560 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ta[i]);.    }.  
33570 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69    for(i=cnt=0; i
33580 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b  <usableSize; i++
33590 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74  ){.      if( hit
335a0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
335b0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d    cnt++;.      }
335c0 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e  else if( hit[i]>
335d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  1 ){.        che
335e0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
335f0 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ck, 0,.         
33600 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20   "Multiple uses 
33610 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70  for byte %d of p
33620 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67  age %d", i, iPag
33630 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
33640 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
33650 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61  .    if( cnt!=da
33660 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20  ta[hdr+7] ){.   
33670 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33680 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
33690 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e          "Fragmen
336a0 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20  ted space is %d 
336b0 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73  byte reported as
336c0 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
336d0 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20  .          cnt, 
336e0 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61  data[hdr+7], iPa
336f0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
33700 20 73 71 6c 69 74 65 46 72 65 65 28 68 69 74 29   sqliteFree(hit)
33710 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
33720 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
33730 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
33740 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
33750 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
33760 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
33770 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
33780 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
33790 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
337a0 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
337b0 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
337c0 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
337d0 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
337e0 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
337f0 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
33800 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
33810 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
33820 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
33830 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
33840 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
33850 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  Root..**.** If e
33860 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73  verything checks
33870 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69   out, this routi
33880 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
33890 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69    If something i
338a0 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65  s.** amiss, an e
338b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
338c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
338d0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
338e0 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e  m malloc().** an
338f0 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
33900 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67  hat error messag
33910 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
33920 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
33930 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
33940 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
33950 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  ng the error mes
33960 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  sage when it is 
33970 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  done..*/.char *s
33980 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
33990 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72  rityCheck(.  Btr
339a0 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68  ee *p,     /* Th
339b0 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63 68  e btree to be ch
339c0 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  ecked */.  int *
339d0 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61  aRoot,   /* An a
339e0 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67  rray of root pag
339f0 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69  es numbers for i
33a00 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73 20  ndividual trees 
33a10 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20  */.  int nRoot, 
33a20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33a30 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
33a40 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72  [] */.  int mxEr
33a50 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65  r,    /* Stop re
33a60 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61  porting errors a
33a70 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a  fter this many *
33a80 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20  /.  int *pnErr  
33a90 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65    /* Write numbe
33aa0 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
33ab0 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c   to this variabl
33ac0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
33ad0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49  .  int nRef;.  I
33ae0 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65 63  ntegrityCk sChec
33af0 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  k;.  BtShared *p
33b00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
33b10 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
33b20 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
33b30 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
33b40 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
33b50 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ry(p)!=SQLITE_OK
33b60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
33b70 71 6c 69 74 65 53 74 72 44 75 70 28 22 55 6e 61  qliteStrDup("Una
33b80 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20 61  ble to acquire a
33b90 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
33ba0 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  e database");.  
33bb0 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d  }.  sCheck.pBt =
33bc0 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70   pBt;.  sCheck.p
33bd0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
33be0 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50  ger;.  sCheck.nP
33bf0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
33c00 65 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65  erPagecount(sChe
33c10 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43  ck.pPager);.  sC
33c20 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45  heck.mxErr = mxE
33c30 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72  rr;.  sCheck.nEr
33c40 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20  r = 0;.  *pnErr 
33c50 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
33c60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33c70 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  UUM.  if( pBt->n
33c80 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
33c90 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70  sCheck.nPage = p
33ca0 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a  Bt->nTrunc;.  }.
33cb0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68  #endif.  if( sCh
33cc0 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  eck.nPage==0 ){.
33cd0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
33ce0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
33cf0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
33d00 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d    sCheck.anRef =
33d10 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
33d20 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b  ( (sCheck.nPage+
33d30 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
33d40 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20  .anRef[0]) );.  
33d50 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65  if( !sCheck.anRe
33d60 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  f ){.    unlockB
33d70 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
33d80 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20  );.    *pnErr = 
33d90 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  1;.    return sq
33da0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 55 6e  lite3MPrintf("Un
33db0 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25  able to malloc %
33dc0 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20  d bytes", .     
33dd0 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65     (sCheck.nPage
33de0 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
33df0 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20  k.anRef[0]));.  
33e00 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  }.  for(i=0; i<=
33e10 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b  sCheck.nPage; i+
33e20 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  +){ sCheck.anRef
33e30 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d  [i] = 0; }.  i =
33e40 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
33e50 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69  GE(pBt);.  if( i
33e60 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29  <=sCheck.nPage )
33e70 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52  {.    sCheck.anR
33e80 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  ef[i] = 1;.  }. 
33e90 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20   sCheck.zErrMsg 
33ea0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
33eb0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
33ec0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
33ed0 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
33ee0 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
33ef0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
33f00 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
33f10 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
33f20 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
33f30 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
33f40 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
33f50 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
33f60 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
33f70 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
33f80 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e  nRoot && sCheck.
33f90 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
33fa0 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
33fb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
33fc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33fd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33fe0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
33ff0 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
34000 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
34010 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
34020 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
34030 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
34040 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
34050 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
34060 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
34070 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
34080 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
34090 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
340a0 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
340b0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
340c0 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
340d0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
340e0 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
340f0 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
34100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
34110 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34120 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
34130 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
34140 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34150 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
34160 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
34170 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
34180 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
34190 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
341a0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
341b0 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
341c0 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
341d0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
341e0 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
341f0 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
34200 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
34210 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
34220 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
34230 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
34240 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
34250 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
34260 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
34270 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
34280 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
34290 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
342a0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
342b0 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
342c0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
342d0 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
342e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
342f0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
34300 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
34310 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
34320 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
34330 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
34340 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
34350 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
34360 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
34370 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
34380 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
34390 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
343a0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
343b0 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
343c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
343d0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
343e0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
343f0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
34400 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
34410 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
34420 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
34430 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
34440 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
34450 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
34460 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
34470 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
34480 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
34490 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
344a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  ..  */.  sqliteF
344b0 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  ree(sCheck.anRef
344c0 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43  );.  *pnErr = sC
344d0 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74  heck.nErr;.  ret
344e0 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d  urn sCheck.zErrM
344f0 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sg;.}.#endif /* 
34500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
34510 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
34520 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
34530 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
34540 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
34550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
34560 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
34570 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
34580 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  lename(Btree *p)
34590 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
345a0 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
345b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
345c0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
345d0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
345e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
345f0 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
34600 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
34610 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
34620 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
34630 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
34640 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
34650 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
34660 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
34670 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
34680 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34690 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70  agerDirname(p->p
346a0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
346b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
346c0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
346d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
346e0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
346f0 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
34700 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75  alue of this rou
34710 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65  tine is the same
34720 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
34730 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  hether the journ
34740 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  al file.** has b
34750 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e  een created or n
34760 6f 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ot..*/.const cha
34770 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
34780 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74  etJournalname(Bt
34790 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
347a0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
347b0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
347c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
347d0 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rnalname(p->pBt-
347e0 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
347f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34800 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f  _VACUUM./*.** Co
34810 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
34820 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72  content of pBtFr
34830 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20  om into pBtTo.  
34840 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  A transaction.**
34850 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
34860 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a  for both files..
34870 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
34880 66 20 66 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d  f file pBtFrom m
34890 61 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79  ay be reduced by
348a0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
348b0 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
348c0 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20  goes wrong, the 
348d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
348e0 42 74 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64  BtFrom is rolled
348f0 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   back..*/.int sq
34900 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69  lite3BtreeCopyFi
34910 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
34920 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
34930 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34940 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50  OK;.  Pgno i, nP
34950 61 67 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53  age, nToPage, iS
34960 6b 69 70 3b 0a 0a 20 20 42 74 53 68 61 72 65 64  kip;..  BtShared
34970 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70   *pBtTo = pTo->p
34980 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  Bt;.  BtShared *
34990 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  pBtFrom = pFrom-
349a0 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f  >pBt;..  if( pTo
349b0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
349c0 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d  _WRITE || pFrom-
349d0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
349e0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
349f0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
34a00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54  ;.  }.  if( pBtT
34a10 6f 2d 3e 70 43 75 72 73 6f 72 20 29 20 72 65 74  o->pCursor ) ret
34a20 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
34a30 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c  .  nToPage = sql
34a40 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
34a50 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nt(pBtTo->pPager
34a60 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
34a70 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
34a80 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  nt(pBtFrom->pPag
34a90 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50  er);.  iSkip = P
34aa0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34ab0 28 70 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69  (pBtTo);.  for(i
34ac0 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
34ad0 4b 20 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69  K && i<=nPage; i
34ae0 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  ++){.    DbPage 
34af0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69 66  *pDbPage;.    if
34b00 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e  ( i==iSkip ) con
34b10 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20  tinue;.    rc = 
34b20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34b30 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c  pBtFrom->pPager,
34b40 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   i, &pDbPage);. 
34b50 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
34b60 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
34b70 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74  te3PagerOverwrit
34b80 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
34b90 20 69 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72   i, sqlite3Pager
34ba0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
34bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
34bc0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
34bd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
34be0 74 68 65 20 66 69 6c 65 20 69 73 20 73 68 72 69  the file is shri
34bf0 6e 6b 69 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74  nking, journal t
34c00 68 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72  he pages that ar
34c10 65 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  e being truncate
34c20 64 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74  d.  ** so that t
34c30 68 65 79 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  hey can be rolle
34c40 64 20 62 61 63 6b 20 69 66 20 74 68 65 20 63 6f  d back if the co
34c50 6d 6d 69 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f  mmit fails..  */
34c60 0a 20 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31  .  for(i=nPage+1
34c70 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
34c80 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69  && i<=nToPage; i
34c90 2b 2b 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  ++){.    DbPage 
34ca0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 69 66  *pDbPage;.    if
34cb0 28 20 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e  ( i==iSkip ) con
34cc0 74 69 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20  tinue;.    rc = 
34cd0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34ce0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69  pBtTo->pPager, i
34cf0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
34d00 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
34d10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34d20 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
34d30 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
34d40 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
34d50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a  pDbPage);.    /*
34d60 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73   Yeah.  It seems
34d70 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44   wierd to call D
34d80 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68 74  ontWrite() right
34d90 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e 20   after Write(). 
34da0 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   But.    ** that
34db0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
34dc0 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70  names of those p
34dd0 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74  rocedures do not
34de0 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a   exactly .    **
34df0 20 72 65 70 72 65 73 65 6e 74 20 77 68 61 74 20   represent what 
34e00 74 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28  they do.  Write(
34e10 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22  ) really means "
34e20 70 75 74 20 74 68 69 73 20 70 61 67 65 20 69 6e  put this page in
34e30 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c   the.    ** roll
34e40 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
34e50 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72 74   mark it as dirt
34e60 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
34e70 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  l be written.   
34e80 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
34e90 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e 22  ase file later."
34ea0 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75 6e    DontWrite() un
34eb0 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20  does the second 
34ec0 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74  part of.    ** t
34ed0 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73  hat and prevents
34ee0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62   the page from b
34ef0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  eing written to 
34f00 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
34f10 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  he.    ** page i
34f20 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72  s still on the r
34f30 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
34f40 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68   though.  And th
34f50 61 74 20 69 73 20 74 68 65 20 77 68 6f 6c 65 0a  at is the whole.
34f60 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20      ** point of 
34f70 74 68 69 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75  this loop: to pu
34f80 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72  t pages on the r
34f90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
34fa0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
34fb0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
34fc0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  e);.  }.  if( !r
34fd0 63 20 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61  c && nPage<nToPa
34fe0 67 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ge ){.    rc = s
34ff0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
35000 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ate(pBtTo->pPage
35010 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  r, nPage);.  }..
35020 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35030 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
35040 62 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20  back(pTo);.  }. 
35050 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
35060 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
35070 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a  _OMIT_VACUUM */.
35080 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
35090 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e  n-zero if a tran
350a0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
350b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
350c0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
350d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
350e0 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e  urn (p && (p->in
350f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
35100 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  TE));.}../*.** R
35110 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
35120 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
35130 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35140 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
35150 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74  te3BtreeIsInStmt
35160 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
35170 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20  turn (p->pBt && 
35180 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b  p->pBt->inStmt);
35190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
351a0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72   non-zero if a r
351b0 65 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74  ead (or write) t
351c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
351d0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
351e0 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
351f0 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  dTrans(Btree *p)
35200 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  {.  return (p &&
35210 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
35220 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f  ANS_NONE));.}../
35230 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35240 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
35250 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f  nter to a blob o
35260 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
35270 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
35280 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65  ngle shared-btre
35290 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73  e. The memory is
352a0 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20   used by client 
352b0 63 6f 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77  code for it's ow
352c0 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66  n.** purposes (f
352d0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73  or example, to s
352e0 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65  tore a high-leve
352f0 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61  l schema associa
35300 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
35310 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20   shared-btree). 
35320 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  The btree layer 
35330 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63  manages referenc
35340 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65  e counting issue
35350 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
35360 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20  st time this is 
35370 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
35380 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73  ed-btree, nBytes
35390 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
353a0 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  .** are allocate
353b0 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72  d, zeroed, and r
353c0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
353d0 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20  aller. For each 
353e0 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63  subsequent .** c
353f0 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70  all the nBytes p
35400 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
35410 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  red and a pointe
35420 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c  r to the same bl
35430 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  ob.** of memory 
35440 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a  returned. .**.**
35450 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
35460 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
35470 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
35480 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
35490 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
354a0 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
354b0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
354c0 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
354d0 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
354e0 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
354f0 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
35500 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
35510 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46  not call sqliteF
35520 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ree().** on the 
35530 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65  memory, the btre
35540 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61  e layer does tha
35550 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  t..*/.void *sqli
35560 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42  te3BtreeSchema(B
35570 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79  tree *p, int nBy
35580 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65  tes, void(*xFree
35590 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74  )(void *)){.  Bt
355a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
355b0 3e 70 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74  >pBt;.  if( !pBt
355c0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
355d0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pBt->pSchema = 
355e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79  sqliteMalloc(nBy
355f0 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78  tes);.    pBt->x
35600 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72  FreeSchema = xFr
35610 65 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ee;.  }.  return
35620 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d   pBt->pSchema;.}
35630 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
35640 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75  rue if another u
35650 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ser of the same 
35660 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73 20  shared btree as 
35670 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  the argument.** 
35680 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20  handle holds an 
35690 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
356a0 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
356b0 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ter table..*/.in
356c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  t sqlite3BtreeSc
356d0 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65  hemaLocked(Btree
356e0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
356f0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
35700 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
35710 45 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54  EAD_LOCK)!=SQLIT
35720 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  E_OK);.}...#ifnd
35730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
35740 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
35750 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  * Obtain a lock 
35760 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f  on the table who
35770 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  se root page is 
35780 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f  iTab.  The.** lo
35790 63 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f  ck is a write lo
357a0 63 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63  ck if isWriteloc
357b0 6b 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72  k is true or a r
357c0 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69  ead lock.** if i
357d0 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69  t is false..*/.i
357e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
357f0 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ockTable(Btree *
35800 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20  p, int iTab, u8 
35810 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20  isWriteLock){.  
35820 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35830 4f 4b 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70  OK;.  u8 lockTyp
35840 65 20 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b  e = (isWriteLock
35850 3f 57 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44  ?WRITE_LOCK:READ
35860 5f 4c 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71  _LOCK);.  rc = q
35870 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
35880 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
35890 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
358a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
358b0 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69  = lockTable(p, i
358c0 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
358d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
358e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
358f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
35900 65 62 75 67 67 69 6e 67 20 69 6e 74 65 72 66 61  ebugging interfa
35910 63 65 20 68 61 73 20 74 6f 20 62 65 20 69 6e 20  ce has to be in 
35920 74 68 69 73 20 66 69 6c 65 20 28 72 61 74 68 65  this file (rathe
35930 72 0a 2a 2a 20 74 68 61 6e 20 69 6e 2c 20 66 6f  r.** than in, fo
35940 72 20 65 78 61 6d 70 6c 65 2c 20 74 65 73 74 31  r example, test1
35950 2e 63 29 20 73 6f 20 74 68 61 74 20 69 74 20 63  .c) so that it c
35960 61 6e 20 67 65 74 20 61 63 63 65 73 73 20 74 6f  an get access to
35970 0a 2a 2a 20 74 68 65 20 64 65 66 69 6e 69 74 69  .** the definiti
35980 6f 6e 20 6f 66 20 42 74 53 68 61 72 65 64 2e 0a  on of BtShared..
35990 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
359a0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
359b0 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 0a 23  defined(TCLSH).#
359c0 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a  include <tcl.h>.
359d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 61 72  int sqlite3_shar
359e0 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 28  ed_cache_report(
359f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
35a00 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
35a10 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
35a20 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
35a30 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
35a40 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
35a50 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
35a60 43 48 45 0a 20 20 63 6f 6e 73 74 20 54 68 72 65  CHE.  const Thre
35a70 61 64 44 61 74 61 20 2a 70 54 64 20 3d 20 73 71  adData *pTd = sq
35a80 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
35a90 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28  eadOnly();.  if(
35aa0 20 70 54 64 2d 3e 75 73 65 53 68 61 72 65 64 44   pTd->useSharedD
35ab0 61 74 61 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ata ){.    BtSha
35ac0 72 65 64 20 2a 70 42 74 3b 0a 20 20 20 20 54 63  red *pBt;.    Tc
35ad0 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
35ae0 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
35af0 66 6f 72 28 70 42 74 3d 70 54 64 2d 3e 70 42 74  for(pBt=pTd->pBt
35b00 72 65 65 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  ree; pBt; pBt=pB
35b10 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
35b20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
35b30 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
35b40 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
35b50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 54 63  Pager);.      Tc
35b60 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
35b70 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
35b80 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
35b90 6e 67 4f 62 6a 28 7a 46 69 6c 65 2c 20 2d 31 29  ngObj(zFile, -1)
35ba0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  );.      Tcl_Lis
35bb0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
35bc0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
35bd0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 42  Tcl_NewIntObj(pB
35be0 74 2d 3e 6e 52 65 66 29 29 3b 0a 20 20 20 20 7d  t->nRef));.    }
35bf0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
35c00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
35c10 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  et);.  }.#endif.
35c20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
35c30 0a 7d 0a 23 65 6e 64 69 66 0a                    .}.#endif.