/ Hex Artifact Content
Login

Artifact 1bd7820b84e93ecd7b4364faeb58565c76cf3cad:


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 37 35 20 32 30 30 37 2f 30  c,v 1.375 2007/0
0190: 35 2f 30 34 20 31 39 3a 30 33 3a 30 33 20 64 61  5/04 19:03:03 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 23 69 66 6e 64 65 66 20 53   is */.#ifndef S
4710: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4720: 4c 4f 42 0a 20 20 75 38 20 69 73 49 6e 63 72 62  LOB.  u8 isIncrb
4730: 6c 6f 62 48 61 6e 64 6c 65 3b 20 20 20 20 20 20  lobHandle;      
4740: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
4750: 63 75 72 73 6f 72 20 69 73 20 61 6e 20 69 6e 63  cursor is an inc
4760: 72 2e 20 69 6f 20 68 61 6e 64 6c 65 20 2a 2f 0a  r. io handle */.
4770: 20 20 50 67 6e 6f 20 2a 61 4f 76 65 72 66 6c 6f    Pgno *aOverflo
4780: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
4790: 61 63 68 65 20 6f 66 20 6f 76 65 72 66 6c 6f 77  ache of overflow
47a0: 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 73 20   page locations 
47b0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
47c0: 0a 2a 2a 20 50 6f 74 65 6e 74 69 61 6c 20 76 61  .** Potential va
47d0: 6c 75 65 73 20 66 6f 72 20 42 74 43 75 72 73 6f  lues for BtCurso
47e0: 72 2e 65 53 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  r.eState..**.** 
47f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a  CURSOR_VALID:.**
4800: 20 20 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 73     Cursor points
4810: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4820: 79 2e 20 67 65 74 50 61 79 6c 6f 61 64 28 29 20  y. getPayload() 
4830: 65 74 63 2e 20 6d 61 79 20 62 65 20 63 61 6c 6c  etc. may be call
4840: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52  ed..**.** CURSOR
4850: 5f 49 4e 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43  _INVALID:.**   C
4860: 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70  ursor does not p
4870: 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20  oint to a valid 
4880: 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e 20  entry. This can 
4890: 68 61 70 70 65 6e 20 28 66 6f 72 20 65 78 61 6d  happen (for exam
48a0: 70 6c 65 29 20 0a 2a 2a 20 20 20 62 65 63 61 75  ple) .**   becau
48b0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  se the table is 
48c0: 65 6d 70 74 79 20 6f 72 20 62 65 63 61 75 73 65  empty or because
48d0: 20 42 74 72 65 65 43 75 72 73 6f 72 46 69 72 73   BtreeCursorFirs
48e0: 74 28 29 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  t() has not been
48f0: 0a 2a 2a 20 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a  .**   called..**
4900: 0a 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49  .** CURSOR_REQUI
4910: 52 45 53 45 45 4b 3a 0a 2a 2a 20 20 20 54 68 65  RESEEK:.**   The
4920: 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 69 73   table that this
4930: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
4940: 65 64 20 6f 6e 20 73 74 69 6c 6c 20 65 78 69 73  ed on still exis
4950: 74 73 2c 20 62 75 74 20 68 61 73 20 62 65 65 6e  ts, but has been
4960: 20 0a 2a 2a 20 20 20 6d 6f 64 69 66 69 65 64 20   .**   modified 
4970: 73 69 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  since the cursor
4980: 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20   was last used. 
4990: 54 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  The cursor posit
49a0: 69 6f 6e 20 69 73 20 73 61 76 65 64 0a 2a 2a 20  ion is saved.** 
49b0: 20 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 42    in variables B
49c0: 74 43 75 72 73 6f 72 2e 70 4b 65 79 20 61 6e 64  tCursor.pKey and
49d0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 2e 20   BtCursor.nKey. 
49e0: 57 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  When a cursor is
49f0: 20 69 6e 20 0a 2a 2a 20 20 20 74 68 69 73 20 73   in .**   this s
4a00: 74 61 74 65 2c 20 72 65 73 74 6f 72 65 4f 72 43  tate, restoreOrC
4a10: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
4a20: 6f 6e 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  on() can be call
4a30: 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
4a40: 0a 2a 2a 20 20 20 73 65 65 6b 20 74 68 65 20 63  .**   seek the c
4a50: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73 61 76  ursor to the sav
4a60: 65 64 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  ed position..*/.
4a70: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 49  #define CURSOR_I
4a80: 4e 56 41 4c 49 44 20 20 20 20 20 20 20 20 20 20  NVALID          
4a90: 20 30 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f   0.#define CURSO
4aa0: 52 5f 56 41 4c 49 44 20 20 20 20 20 20 20 20 20  R_VALID         
4ab0: 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 43 55      1.#define CU
4ac0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
4ad0: 20 20 20 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20         2../*.** 
4ae0: 54 68 65 20 54 52 41 43 45 20 6d 61 63 72 6f 20  The TRACE macro 
4af0: 77 69 6c 6c 20 70 72 69 6e 74 20 68 69 67 68 2d  will print high-
4b00: 6c 65 76 65 6c 20 73 74 61 74 75 73 20 69 6e 66  level status inf
4b10: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
4b20: 68 65 0a 2a 2a 20 62 74 72 65 65 20 6f 70 65 72  he.** btree oper
4b30: 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 67  ation when the g
4b40: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 73  lobal variable s
4b50: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
4b60: 63 65 20 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64  ce is.** enabled
4b70: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
4b80: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 52  TEST.# define TR
4b90: 41 43 45 28 58 29 20 20 20 69 66 28 20 73 71 6c  ACE(X)   if( sql
4ba0: 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65  ite3_btree_trace
4bb0: 20 29 5c 0a 2f 2a 20 20 20 20 20 20 20 20 20 20   )\./*          
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
4bd0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4be0: 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64  tf X; fflush(std
4bf0: 6f 75 74 29 3b 20 7d 20 2a 2f 20 5c 0a 7b 20 70  out); } */ \.{ p
4c00: 72 69 6e 74 66 20 58 3b 20 66 66 6c 75 73 68 28  rintf X; fflush(
4c10: 73 74 64 6f 75 74 29 3b 20 7d 0a 69 6e 74 20 73  stdout); }.int s
4c20: 71 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61  qlite3_btree_tra
4c30: 63 65 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  ce=0;  /* True t
4c40: 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67  o enable tracing
4c50: 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   */.#else.# defi
4c60: 6e 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64  ne TRACE(X).#end
4c70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
4c80: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
4c90: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4ca0: 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65  kReadLocks(Btree
4cb0: 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a  *,Pgno,BtCursor*
4cc0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f  );../*.** Read o
4cd0: 72 20 77 72 69 74 65 20 61 20 74 77 6f 2d 20 61  r write a two- a
4ce0: 6e 64 20 66 6f 75 72 2d 62 79 74 65 20 62 69 67  nd four-byte big
4cf0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
4d00: 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
4d10: 63 20 75 33 32 20 67 65 74 32 62 79 74 65 28 75  c u32 get2byte(u
4d20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29  nsigned char *p)
4d30: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d  {.  return (p[0]
4d40: 3c 3c 38 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73  <<8) | p[1];.}.s
4d50: 74 61 74 69 63 20 75 33 32 20 67 65 74 34 62 79  tatic u32 get4by
4d60: 74 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  te(unsigned char
4d70: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
4d80: 70 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31  p[0]<<24) | (p[1
4d90: 5d 3c 3c 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c  ]<<16) | (p[2]<<
4da0: 38 29 20 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61  8) | p[3];.}.sta
4db0: 74 69 63 20 76 6f 69 64 20 70 75 74 32 62 79 74  tic void put2byt
4dc0: 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  e(unsigned char 
4dd0: 2a 70 2c 20 75 33 32 20 76 29 7b 0a 20 20 70 5b  *p, u32 v){.  p[
4de0: 30 5d 20 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31  0] = v>>8;.  p[1
4df0: 5d 20 3d 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20  ] = v;.}.static 
4e00: 76 6f 69 64 20 70 75 74 34 62 79 74 65 28 75 6e  void put4byte(un
4e10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
4e20: 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d  u32 v){.  p[0] =
4e30: 20 76 3e 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d   v>>24;.  p[1] =
4e40: 20 76 3e 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d   v>>16;.  p[2] =
4e50: 20 76 3e 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20   v>>8;.  p[3] = 
4e60: 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  v;.}../*.** Rout
4e70: 69 6e 65 73 20 74 6f 20 72 65 61 64 20 61 6e 64  ines to read and
4e80: 20 77 72 69 74 65 20 76 61 72 69 61 62 6c 65 2d   write variable-
4e90: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e  length integers.
4ea0: 20 20 54 68 65 73 65 20 75 73 65 64 20 74 6f 0a    These used to.
4eb0: 2a 2a 20 62 65 20 64 65 66 69 6e 65 64 20 6c 6f  ** be defined lo
4ec0: 63 61 6c 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77  cally, but now w
4ed0: 65 20 75 73 65 20 74 68 65 20 76 61 72 69 6e 74  e use the varint
4ee0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 65   routines in the
4ef0: 20 75 74 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e   util.c.** file.
4f00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 56  .*/.#define getV
4f10: 61 72 69 6e 74 20 20 20 20 73 71 6c 69 74 65 33  arint    sqlite3
4f20: 47 65 74 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65  GetVarint./* #de
4f30: 66 69 6e 65 20 67 65 74 56 61 72 69 6e 74 33 32  fine getVarint32
4f40: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
4f50: 6e 74 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20  nt32 */.#define 
4f60: 67 65 74 56 61 72 69 6e 74 33 32 28 41 2c 42 29  getVarint32(A,B)
4f70: 20 20 28 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78    ((*B=*(A))<=0x
4f80: 37 66 3f 31 3a 73 71 6c 69 74 65 33 47 65 74 56  7f?1:sqlite3GetV
4f90: 61 72 69 6e 74 33 32 28 41 2c 42 29 29 0a 23 64  arint32(A,B)).#d
4fa0: 65 66 69 6e 65 20 70 75 74 56 61 72 69 6e 74 20  efine putVarint 
4fb0: 20 20 20 73 71 6c 69 74 65 33 50 75 74 56 61 72     sqlite3PutVar
4fc0: 69 6e 74 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61  int../* The data
4fd0: 62 61 73 65 20 70 61 67 65 20 74 68 65 20 50 45  base page the PE
4fe0: 4e 44 49 4e 47 5f 42 59 54 45 20 6f 63 63 75 70  NDING_BYTE occup
4ff0: 69 65 73 2e 20 54 68 69 73 20 70 61 67 65 20 69  ies. This page i
5000: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a  s never used..**
5010: 20 54 4f 44 4f 3a 20 54 68 69 73 20 6d 61 63 72   TODO: This macr
5020: 6f 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  o is very simila
5030: 72 79 20 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50  ry to PAGER_MJ_P
5040: 47 4e 4f 28 29 20 69 6e 20 70 61 67 65 72 2e 63  GNO() in pager.c
5050: 2e 20 54 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  . They.** should
5060: 20 70 6f 73 73 69 62 6c 79 20 62 65 20 63 6f 6e   possibly be con
5070: 73 6f 6c 69 64 61 74 65 64 20 28 70 72 65 73 75  solidated (presu
5080: 6d 61 62 6c 79 20 69 6e 20 70 61 67 65 72 2e 68  mably in pager.h
5090: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b  )..**.** If disk
50a0: 20 49 2f 4f 20 69 73 20 6f 6d 69 74 74 65 64 20   I/O is omitted 
50b0: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
50c0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
50d0: 6f 72 65 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69  ored purely.** i
50e0: 6e 20 6d 65 6d 6f 72 79 29 20 74 68 65 6e 20 74  n memory) then t
50f0: 68 65 72 65 20 69 73 20 6e 6f 20 70 65 6e 64 69  here is no pendi
5100: 6e 67 20 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64  ng byte..*/.#ifd
5110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
5120: 49 53 4b 49 4f 0a 23 20 64 65 66 69 6e 65 20 50  ISKIO.# define P
5130: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
5140: 28 70 42 74 29 20 20 30 78 37 66 66 66 66 66 66  (pBt)  0x7ffffff
5150: 66 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  f.#else.# define
5160: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
5170: 47 45 28 70 42 74 29 20 28 28 50 45 4e 44 49 4e  GE(pBt) ((PENDIN
5180: 47 5f 42 59 54 45 2f 28 70 42 74 29 2d 3e 70 61  G_BYTE/(pBt)->pa
5190: 67 65 53 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69  geSize)+1).#endi
51a0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65  f../*.** A linke
51b0: 64 20 6c 69 73 74 20 6f 66 20 74 68 65 20 66 6f  d list of the fo
51c0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
51d0: 65 73 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  es is stored at 
51e0: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a  BtShared.pLock..
51f0: 2a 2a 20 4c 6f 63 6b 73 20 61 72 65 20 61 64 64  ** Locks are add
5200: 65 64 20 28 6f 72 20 75 70 67 72 61 64 65 64 20  ed (or upgraded 
5210: 66 72 6f 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74  from READ_LOCK t
5220: 6f 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68  o WRITE_LOCK) wh
5230: 65 6e 20 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20  en a cursor .** 
5240: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
5250: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5260: 20 70 61 67 65 20 42 74 53 68 61 72 65 64 2e 69   page BtShared.i
5270: 54 61 62 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65  Table. Locks are
5280: 20 72 65 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d   removed.** from
5290: 20 74 68 69 73 20 6c 69 73 74 20 77 68 65 6e 20   this list when 
52a0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
52b0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
52c0: 6c 6c 65 64 20 62 61 63 6b 2c 20 6f 72 20 77 68  lled back, or wh
52d0: 65 6e 0a 2a 2a 20 61 20 62 74 72 65 65 20 68 61  en.** a btree ha
52e0: 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a  ndle is closed..
52f0: 2a 2f 0a 73 74 72 75 63 74 20 42 74 4c 6f 63 6b  */.struct BtLock
5300: 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72   {.  Btree *pBtr
5310: 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74  ee;        /* Bt
5320: 72 65 65 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69  ree handle holdi
5330: 6e 67 20 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a  ng this lock */.
5340: 20 20 50 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20    Pgno iTable;  
5350: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
5360: 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f  page of table */
5370: 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20  .  u8 eLock;    
5380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 44           /* READ
5390: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
53a0: 4f 43 4b 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20  OCK */.  BtLock 
53b0: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 2f  *pNext;        /
53c0: 2a 20 4e 65 78 74 20 69 6e 20 42 74 53 68 61 72  * Next in BtShar
53d0: 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f  ed.pLock list */
53e0: 0a 7d 3b 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74  .};../* Candidat
53f0: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 42 74 4c  e values for BtL
5400: 6f 63 6b 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65  ock.eLock */.#de
5410: 66 69 6e 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20  fine READ_LOCK  
5420: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 52 49     1.#define WRI
5430: 54 45 5f 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69  TE_LOCK    2..#i
5440: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5450: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
5460: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
5470: 74 69 6f 6e 73 20 71 75 65 72 79 54 61 62 6c 65  tions queryTable
5480: 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c  Lock(), lockTabl
5490: 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c  e() and unlockAl
54a0: 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d  lTables().  ** m
54b0: 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69 65  anipulate entrie
54c0: 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72 65  s in the BtShare
54d0: 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c  d.pLock linked l
54e0: 69 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ist used to stor
54f0: 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61  e.  ** shared-ca
5500: 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c 20  che table level 
5510: 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c 69  locks. If the li
5520: 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65  brary is compile
5530: 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
5540: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
5550: 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74  ture disabled, t
5560: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  hen there is onl
5570: 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72 0a  y ever one user.
5580: 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74 53    ** of each BtS
5590: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
55a0: 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b  and so this lock
55b0: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
55c0: 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64  sary. .  ** So d
55d0: 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72  efine the lock r
55e0: 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73  elated functions
55f0: 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f   as no-ops..  */
5600: 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65 72 79  .  #define query
5610: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
5620: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
5630: 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61  fine lockTable(a
5640: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
5650: 20 20 23 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b    #define unlock
5660: 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a 23 65 6c  AllTables(a).#el
5670: 73 65 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  se../*.** Query 
5680: 74 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20  to see if btree 
5690: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
56a0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
56b0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
56c0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
56d0: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
56e0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
56f0: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
5700: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
5710: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
5720: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
5730: 6c 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29  ling lockTable()
5740: 29 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  ), or.** SQLITE_
5750: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
5760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
5770: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  ryTableLock(Btre
5780: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
5790: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
57a0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
57b0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
57c0: 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69  pIter;..  /* Thi
57d0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
57e0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
57f0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
5800: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
5810: 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
5820: 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72  dOnly()->useShar
5830: 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 72 65  edData ){.    re
5840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5850: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28    }..  /* This (
5860: 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54  along with lockT
5870: 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72 65  able()) is where
5880: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
5890: 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20 2a  tted flag is.  *
58a0: 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49 66  * dealt with. If
58b0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 71   the caller is q
58c0: 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72 65  uerying for a re
58d0: 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20  ad-lock and the 
58e0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65 74  flag is.  ** set
58f0: 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69 74  , it is uncondit
5900: 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64 20  ionally granted 
5910: 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  - even if there 
5920: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
5930: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
5940: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
5950: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
5960: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
5970: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
5980: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
5990: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
59a0: 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c  unction lockTabl
59b0: 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c  e(), if a read-l
59c0: 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20  ock is demanded 
59d0: 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65  and the .  ** Re
59e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
59f0: 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e  ag is set, no en
5a00: 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20  try is added to 
5a10: 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a  the locks list .
5a20: 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70    ** (BtShared.p
5a30: 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Lock)..  **.  **
5a40: 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49   To summarize: I
5a50: 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  f the ReadUncomm
5a60: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
5a70: 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72  t, then read cur
5a80: 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74  sors do.  ** not
5a90: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
5aa0: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
5ab0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63  The locking proc
5ac0: 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20 2a  edure for a .  *
5ad0: 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64  * write-cursor d
5ae0: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a  oes not change..
5af0: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
5b00: 21 70 2d 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a  !p->pSqlite || .
5b10: 20 20 20 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69      0==(p->pSqli
5b20: 74 65 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  te->flags&SQLITE
5b30: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
5b40: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
5b50: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
5b60: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
5b70: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
5b80: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
5b90: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
5ba0: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
5bb0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
5bc0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
5bd0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
5be0: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
5bf0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
5c00: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
5c10: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
5c20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5c30: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
5c40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
5c70: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
5c80: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
5c90: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
5ca0: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
5cb0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
5cc0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
5cd0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
5ce0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
5cf0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
5d00: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
5d10: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
5d20: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
5d30: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
5d40: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
5d50: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
5d60: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
5d70: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
5d80: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
5d90: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
5da0: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
5db0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
5dc0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
5dd0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
5de0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
5df0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
5e00: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
5e10: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
5e20: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
5e30: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 54 68  if( 0==sqlite3Th
5e40: 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
5e50: 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74  ()->useSharedDat
5e60: 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  a ){.    return 
5e70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
5e80: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
5e90: 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c  _OK==queryTableL
5ea0: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
5eb0: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Lock) );..  /* I
5ec0: 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  f the read-uncom
5ed0: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
5ee0: 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  et and a read-lo
5ef0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
5f00: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72  .  ** return ear
5f10: 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e  ly without addin
5f20: 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  g an entry to th
5f30: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
5f40: 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20   list. See.  ** 
5f50: 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74  comment in funct
5f60: 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  ion queryTableLo
5f70: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e  ck() for more in
5f80: 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a  fo on handling .
5f90: 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63    ** the ReadUnc
5fa0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20  ommitted flag.. 
5fb0: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
5fc0: 70 2d 3e 70 53 71 6c 69 74 65 29 20 26 26 20 0a  p->pSqlite) && .
5fd0: 20 20 20 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d      (p->pSqlite-
5fe0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
5ff0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
6000: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
6010: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
6020: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
6030: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
6040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6050: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
6060: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
6070: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
6080: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
6090: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
60a0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
60b0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
60c0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
60d0: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
60e0: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
60f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
6100: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
6110: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
6120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6130: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
6140: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
6150: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
6160: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
6170: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
6180: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
6190: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
61a0: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
61b0: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
61c0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
61d0: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
61e0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  *)sqliteMalloc(s
61f0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
6200: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
6210: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6220: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6230: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
6240: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
6250: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
6260: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
6270: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
6280: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
6290: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
62a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
62b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
62c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
62d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
62e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
62f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
6300: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
6310: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
6320: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
6330: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
6340: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
6350: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
6360: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
6370: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
6380: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
6390: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
63a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
63b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
63c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
63d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
63e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
63f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
6400: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
6410: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
6420: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
6430: 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28  o the lockTable(
6440: 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20  ).** procedure) 
6450: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61  held by Btree ha
6460: 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  ndle p..*/.stati
6470: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c  c void unlockAll
6480: 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29  Tables(Btree *p)
6490: 7b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  {.  BtLock **ppI
64a0: 74 65 72 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70  ter = &p->pBt->p
64b0: 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Lock;..  /* If t
64c0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
64d0: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74  extension is not
64e0: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20   enabled, there 
64f0: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a  should be no.  *
6500: 2a 20 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 42  * locks in the B
6510: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
6520: 73 74 2c 20 6d 61 6b 69 6e 67 20 74 68 69 73 20  st, making this 
6530: 70 72 6f 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f  procedure a no-o
6540: 70 2e 20 41 73 73 65 72 74 0a 20 20 2a 2a 20 74  p. Assert.  ** t
6550: 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20  hat this is the 
6560: 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  case..  */.  ass
6570: 65 72 74 28 20 73 71 6c 69 74 65 33 54 68 72 65  ert( sqlite3Thre
6580: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
6590: 2d 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20  ->useSharedData 
65a0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
65b0: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
65c0: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
65d0: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
65e0: 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  r;.    if( pLock
65f0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
6600: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
6610: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
6620: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
6630: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
6640: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
6650: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
6660: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
6670: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6680: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
6690: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
66a0: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
66b0: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
66c0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
66d0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
66e0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
66f0: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
6700: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
6710: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
6720: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
6730: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
6740: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
6750: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
6760: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6770: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
6780: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
6790: 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
67a0: 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w = 0;.}../*.** 
67b0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
67c0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
67d0: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
67e0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
67f0: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
6800: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
6810: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
6820: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
6830: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
6840: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
6850: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
6860: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
6870: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
6880: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
6890: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
68a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  p);.  }.}.#else.
68b0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
68c0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
68d0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
68e0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
68f0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e  flowCache(x).#en
6900: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  dif../*.** Save 
6910: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
6920: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
6930: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
6940: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
6950: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
6960: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
6970: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
6980: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6990: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
69a0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
69b0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
69c0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
69d0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
69e0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
69f0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
6a00: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
6a10: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
6a20: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
6a30: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
6a40: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
6a50: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
6a60: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
6a70: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
6a80: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
6a90: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
6aa0: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
6ab0: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
6ac0: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
6ad0: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
6ae0: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
6af0: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
6b00: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
6b10: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
6b20: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
6b30: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
6b40: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
6b50: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
6b60: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
6b70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6b80: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
6b90: 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b  >pPage->intKey){
6ba0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
6bb0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70  = sqliteMalloc(p
6bc0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  Cur->nKey);.    
6bd0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
6be0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6bf0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
6c00: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
6c10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
6c20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6c30: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6c40: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
6c50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6c60: 6c 69 74 65 46 72 65 65 28 70 4b 65 79 29 3b 0a  liteFree(pKey);.
6c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6c80: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
6c90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6ca0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
6cb0: 21 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCur->pPage->in
6cc0: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
6cd0: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
6ce0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6cf0: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
6d00: 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
6d10: 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30   pCur->pPage = 0
6d20: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
6d30: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
6d40: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
6d50: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
6d60: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
6d70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6d80: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
6d90: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
6da0: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
6db0: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
6dc0: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
6dd0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
6de0: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
6df0: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
6e00: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
6e10: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6e20: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
6e30: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
6e40: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
6e50: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
6e60: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6e70: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
6e80: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
6e90: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
6ea0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
6eb0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
6ec0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
6ed0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
6ee0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
6ef0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
6f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
6f10: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
6f20: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6f30: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
6f40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6f50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6f60: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6f70: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
6f80: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
6f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6fb0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6fc0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6fd0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
6ff0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
7000: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
7010: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
7020: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
7030: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
7040: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7050: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
7060: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
7070: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
7080: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
7090: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
70a0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
70b0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
70c0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
70d0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
70e0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
70f0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7100: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7110: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7120: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7130: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7140: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7150: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7160: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
7170: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
7180: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
7190: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
71a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
71b0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
71c0: 72 67 75 6d 65 6e 74 20 2d 20 64 6f 53 65 65 6b  rgument - doSeek
71d0: 20 2d 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65   - is false, the
71e0: 6e 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 2a 2a  n instead of .**
71f0: 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20 63   returning the c
7200: 75 72 73 6f 72 20 74 6f 20 69 74 27 73 20 73 61  ursor to it's sa
7210: 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  ved position, an
7220: 79 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  y saved position
7230: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   is deleted.** a
7240: 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
7250: 61 74 65 20 73 65 74 20 74 6f 20 43 55 52 53 4f  ate set to CURSO
7260: 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f 0a 73 74  R_INVALID..*/.st
7270: 61 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65  atic int restore
7280: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
7290: 69 74 69 6f 6e 58 28 42 74 43 75 72 73 6f 72 20  itionX(BtCursor 
72a0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
72b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
72c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
72d0: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
72e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
72f0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
7300: 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
7310: 6c 6f 62 48 61 6e 64 6c 65 20 29 7b 0a 20 20 20  lobHandle ){.   
7320: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
7330: 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
7340: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
7350: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
7360: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7370: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
7380: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
7390: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
73a0: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
73b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
73c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
73d0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
73e0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
73f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
7400: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7410: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
7420: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7430: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a  _INVALID );.  }.
7440: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7450: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f  #define restoreO
7460: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
7470: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
7480: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52  eState==CURSOR_R
7490: 45 51 55 49 52 45 53 45 45 4b 3f 72 65 73 74 6f  EQUIRESEEK?resto
74a0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
74b0: 6f 73 69 74 69 6f 6e 58 28 70 29 3a 53 51 4c 49  ositionX(p):SQLI
74c0: 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66 20  TE_OK)..#ifndef 
74d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
74e0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65  VACUUM./*.** The
74f0: 73 65 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  se macros define
7500: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
7510: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
7520: 20 65 6e 74 72 79 20 66 6f 72 20 61 20 0a 2a 2a   entry for a .**
7530: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
7540: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7550: 6e 74 20 74 6f 20 65 61 63 68 20 69 73 20 74 68  nt to each is th
7560: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  e number of usab
7570: 6c 65 0a 2a 2a 20 62 79 74 65 73 20 6f 6e 20 65  le.** bytes on e
7580: 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20  ach page of the 
7590: 64 61 74 61 62 61 73 65 20 28 6f 66 74 65 6e 20  database (often 
75a0: 31 30 32 34 29 2e 20 54 68 65 20 73 65 63 6f 6e  1024). The secon
75b0: 64 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  d is the.** page
75c0: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 6f 6b 20   number to look 
75d0: 75 70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  up in the pointe
75e0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  r map..**.** PTR
75f0: 4d 41 50 5f 50 41 47 45 4e 4f 20 72 65 74 75 72  MAP_PAGENO retur
7600: 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
7610: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
7620: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
7630: 2a 20 70 61 67 65 20 74 68 61 74 20 73 74 6f 72  * page that stor
7640: 65 73 20 74 68 65 20 72 65 71 75 69 72 65 64 20  es the required 
7650: 70 6f 69 6e 74 65 72 2e 20 50 54 52 4d 41 50 5f  pointer. PTRMAP_
7660: 50 54 52 4f 46 46 53 45 54 20 72 65 74 75 72 6e  PTROFFSET return
7670: 73 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20  s.** the offset 
7680: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
7690: 20 6d 61 70 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a   map entry..**.*
76a0: 2a 20 49 66 20 74 68 65 20 70 67 6e 6f 20 61 72  * If the pgno ar
76b0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
76c0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 20 69   PTRMAP_PAGENO i
76d0: 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  s a pointer-map 
76e0: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 70 67  page,.** then pg
76f0: 6e 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  no is returned. 
7700: 53 6f 20 28 70 67 6e 6f 3d 3d 50 54 52 4d 41 50  So (pgno==PTRMAP
7710: 5f 50 41 47 45 4e 4f 28 70 67 73 7a 2c 20 70 67  _PAGENO(pgsz, pg
7720: 6e 6f 29 29 20 63 61 6e 20 62 65 0a 2a 2a 20 75  no)) can be.** u
7730: 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 70  sed to test if p
7740: 67 6e 6f 20 69 73 20 61 20 70 6f 69 6e 74 65 72  gno is a pointer
7750: 2d 6d 61 70 20 70 61 67 65 2e 20 50 54 52 4d 41  -map page. PTRMA
7760: 50 5f 49 53 50 41 47 45 20 69 6d 70 6c 65 6d 65  P_ISPAGE impleme
7770: 6e 74 73 0a 2a 2a 20 74 68 69 73 20 74 65 73 74  nts.** this test
7780: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52  ..*/.#define PTR
7790: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
77a0: 70 67 6e 6f 29 20 70 74 72 6d 61 70 50 61 67 65  pgno) ptrmapPage
77b0: 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 0a 23 64  no(pBt, pgno).#d
77c0: 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50 54 52  efine PTRMAP_PTR
77d0: 4f 46 46 53 45 54 28 70 42 74 2c 20 70 67 6e 6f  OFFSET(pBt, pgno
77e0: 29 20 28 35 2a 28 70 67 6e 6f 2d 70 74 72 6d 61  ) (5*(pgno-ptrma
77f0: 70 50 61 67 65 6e 6f 28 70 42 74 2c 20 70 67 6e  pPageno(pBt, pgn
7800: 6f 29 2d 31 29 29 0a 23 64 65 66 69 6e 65 20 50  o)-1)).#define P
7810: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7820: 2c 20 70 67 6e 6f 29 20 28 50 54 52 4d 41 50 5f  , pgno) (PTRMAP_
7830: 50 41 47 45 4e 4f 28 28 70 42 74 29 2c 28 70 67  PAGENO((pBt),(pg
7840: 6e 6f 29 29 3d 3d 28 70 67 6e 6f 29 29 0a 0a 73  no))==(pgno))..s
7850: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7860: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7870: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7880: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7890: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
78a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
78b0: 31 3b 0a 20 20 69 6e 74 20 69 50 74 72 4d 61 70  1;.  int iPtrMap
78c0: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
78d0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
78e0: 69 6e 74 20 72 65 74 20 3d 20 28 69 50 74 72 4d  int ret = (iPtrM
78f0: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
7900: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
7910: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
7920: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
7930: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7940: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7950: 2f 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  /*.** The pointe
7960: 72 20 6d 61 70 20 69 73 20 61 20 6c 6f 6f 6b 75  r map is a looku
7970: 70 20 74 61 62 6c 65 20 74 68 61 74 20 69 64 65  p table that ide
7980: 6e 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65  ntifies the pare
7990: 6e 74 20 70 61 67 65 20 66 6f 72 0a 2a 2a 20 65  nt page for.** e
79a0: 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 69  ach child page i
79b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
79c0: 69 6c 65 2e 20 20 54 68 65 20 70 61 72 65 6e 74  ile.  The parent
79d0: 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
79e0: 65 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  e that.** contai
79f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
7a00: 74 68 65 20 63 68 69 6c 64 2e 20 20 45 76 65 72  the child.  Ever
7a10: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  y page in the da
7a20: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 0a  tabase contains.
7a30: 2a 2a 20 30 20 6f 72 20 31 20 70 61 72 65 6e 74  ** 0 or 1 parent
7a40: 20 70 61 67 65 73 2e 20 20 28 49 6e 20 74 68 69   pages.  (In thi
7a50: 73 20 63 6f 6e 74 65 78 74 20 27 64 61 74 61 62  s context 'datab
7a60: 61 73 65 20 70 61 67 65 27 20 72 65 66 65 72 73  ase page' refers
7a70: 0a 2a 2a 20 74 6f 20 61 6e 79 20 70 61 67 65 20  .** to any page 
7a80: 74 68 61 74 20 69 73 20 6e 6f 74 20 70 61 72 74  that is not part
7a90: 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
7aa0: 6d 61 70 20 69 74 73 65 6c 66 2e 29 20 20 45 61  map itself.)  Ea
7ab0: 63 68 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a  ch pointer map.*
7ac0: 2a 20 65 6e 74 72 79 20 63 6f 6e 73 69 73 74 73  * entry consists
7ad0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 79 74   of a single byt
7ae0: 65 20 27 74 79 70 65 27 20 61 6e 64 20 61 20 34  e 'type' and a 4
7af0: 20 62 79 74 65 20 70 61 72 65 6e 74 20 70 61 67   byte parent pag
7b00: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65  e number..** The
7b10: 20 50 54 52 4d 41 50 5f 58 58 58 20 69 64 65 6e   PTRMAP_XXX iden
7b20: 74 69 66 69 65 72 73 20 62 65 6c 6f 77 20 61 72  tifiers below ar
7b30: 65 20 74 68 65 20 76 61 6c 69 64 20 74 79 70 65  e the valid type
7b40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72  s..**.** The pur
7b50: 70 6f 73 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  pose of the poin
7b60: 74 65 72 20 6d 61 70 20 69 73 20 74 6f 20 66 61  ter map is to fa
7b70: 63 69 6c 69 74 79 20 6d 6f 76 69 6e 67 20 70 61  cility moving pa
7b80: 67 65 73 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ges from one.** 
7b90: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
7ba0: 66 69 6c 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  file to another 
7bb0: 61 73 20 70 61 72 74 20 6f 66 20 61 75 74 6f 76  as part of autov
7bc0: 61 63 75 75 6d 2e 20 20 57 68 65 6e 20 61 20 70  acuum.  When a p
7bd0: 61 67 65 0a 2a 2a 20 69 73 20 6d 6f 76 65 64 2c  age.** is moved,
7be0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 6e 20   the pointer in 
7bf0: 69 74 73 20 70 61 72 65 6e 74 20 6d 75 73 74 20  its parent must 
7c00: 62 65 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f  be updated to po
7c10: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65  int to the.** ne
7c20: 77 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65  w location.  The
7c30: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
7c40: 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
7c50: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 71  he parent page q
7c60: 75 69 63 6b 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 54  uickly..**.** PT
7c70: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 3a 20 54  RMAP_ROOTPAGE: T
7c80: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7c90: 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 2e   is a root-page.
7ca0: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
7cb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
7cd0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
7ce0: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 46 52 45 45  *.** PTRMAP_FREE
7cf0: 50 41 47 45 3a 20 54 68 65 20 64 61 74 61 62 61  PAGE: The databa
7d00: 73 65 20 70 61 67 65 20 69 73 20 61 6e 20 75 6e  se page is an un
7d10: 75 73 65 64 20 28 66 72 65 65 29 20 70 61 67 65  used (free) page
7d20: 2e 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  . The page-numbe
7d30: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
7d40: 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20 75 73         is not us
7d50: 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
7d60: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
7d70: 45 52 46 4c 4f 57 31 3a 20 54 68 65 20 64 61 74  ERFLOW1: The dat
7d80: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68  abase page is th
7d90: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
7da0: 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20 20 20  a list of .**   
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7dd0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
7de0: 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 70  identifies the p
7df0: 61 67 65 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  age that.**     
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7e10: 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
7e20: 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74  with a pointer t
7e30: 6f 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  o this overflow 
7e40: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  page..**.** PTRM
7e50: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 54 68  AP_OVERFLOW2: Th
7e60: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
7e70: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  is the second or
7e80: 20 6c 61 74 65 72 20 70 61 67 65 20 69 6e 20 61   later page in a
7e90: 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
7eb0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
7ec0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 64  e page-number id
7ed0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 70 72 65  entifies the pre
7ee0: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  vious.**        
7ef0: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
7f00: 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
7f10: 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  page list..**.**
7f20: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 54   PTRMAP_BTREE: T
7f30: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
7f40: 20 69 73 20 61 20 6e 6f 6e 2d 72 6f 6f 74 20 62   is a non-root b
7f50: 74 72 65 65 20 70 61 67 65 2e 20 54 68 65 20 70  tree page. The p
7f60: 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  age number.**   
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 65 6e              iden
7f80: 74 69 66 69 65 73 20 74 68 65 20 70 61 72 65 6e  tifies the paren
7f90: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 74  t page in the bt
7fa0: 72 65 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ree..*/.#define 
7fb0: 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
7fc0: 31 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  1.#define PTRMAP
7fd0: 5f 46 52 45 45 50 41 47 45 20 32 0a 23 64 65 66  _FREEPAGE 2.#def
7fe0: 69 6e 65 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  ine PTRMAP_OVERF
7ff0: 4c 4f 57 31 20 33 0a 23 64 65 66 69 6e 65 20 50  LOW1 3.#define P
8000: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
8010: 34 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  4.#define PTRMAP
8020: 5f 42 54 52 45 45 20 35 0a 0a 2f 2a 0a 2a 2a 20  _BTREE 5../*.** 
8030: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
8040: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
8050: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
8060: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
8070: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
8080: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
8090: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
80a0: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
80b0: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
80c0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
80d0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
80e0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
80f0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8100: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8110: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
8120: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8130: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
8140: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8150: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
8160: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
8170: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
8180: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
8190: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
81a0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
81b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
81c0: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
81d0: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
81e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
81f0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
8200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
8210: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
8220: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
8230: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
8240: 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d   rc;..  /* The m
8250: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
8260: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
8270: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
8280: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
8290: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
82a0: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
82b0: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
82c0: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
82d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
82e0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
82f0: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
8300: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8310: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8320: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
8330: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8340: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
8350: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
8360: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
8370: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
8380: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8390: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
83a0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
83b0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
83c0: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
83d0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
83e0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
83f0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
8400: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
8410: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
8420: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
8430: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
8440: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
8450: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
8460: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
8470: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
8480: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72   parent));.    r
8490: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
84a0: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
84b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
84c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
84d0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
84e0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
84f0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8500: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
8510: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
8520: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8530: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72  ef(pDbPage);.  r
8540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8550: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
8560: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
8570: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
8580: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
8590: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
85a0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
85b0: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
85c0: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
85d0: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
85e0: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
85f0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
8600: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
8610: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8620: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
8630: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
8640: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
8650: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
8660: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
8670: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
8680: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
8690: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
86a0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
86b0: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
86c0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
86d0: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
86e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
86f0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
8700: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
8710: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8720: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
8730: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8740: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8750: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
8760: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
8770: 74 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61 70  t rc;..  iPtrmap
8780: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
8790: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
87a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
87b0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
87c0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
87d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
87e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
87f0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
8800: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
8810: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8820: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
8830: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
8840: 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  ET(pBt, key);.  
8850: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
8860: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
8870: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
8880: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
8890: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
88a0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
88b0: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
88c0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
88d0: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
88e0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
88f0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
8900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8910: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8920: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
8930: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
8940: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  TOVACUUM */../*.
8950: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
8960: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
8970: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
8980: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
8990: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
89a0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
89b0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
89c0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
89d0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
89e0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
89f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8a00: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
8a10: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
8a20: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
8a30: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  low cells..*/.st
8a40: 61 74 69 63 20 75 38 20 2a 66 69 6e 64 43 65 6c  atic u8 *findCel
8a50: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
8a60: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
8a70: 75 38 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  u8 *data = pPage
8a80: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
8a90: 74 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20  t( iCell>=0 );. 
8aa0: 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67   assert( iCell<g
8ab0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
8ac0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
8ad0: 5d 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  ]) );.  return d
8ae0: 61 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26  ata + get2byte(&
8af0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
8b00: 4f 66 66 73 65 74 2b 32 2a 69 43 65 6c 6c 5d 29  Offset+2*iCell])
8b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8b20: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
8b30: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
8b40: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
8b50: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
8b60: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
8b70: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
8b80: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
8b90: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
8ba0: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
8bb0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8bc0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
8bd0: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
8be0: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
8bf0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
8c00: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
8c10: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
8c20: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
8c30: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
8c40: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
8c50: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
8c60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
8c70: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
8c80: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
8c90: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
8ca0: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
8cb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8cc0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8cd0: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
8ce0: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
8cf0: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
8d00: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
8d10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
8d20: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
8d30: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
8d40: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 70 61  is function.  pa
8d50: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
8d60: 61 20 63 65 6c 6c 20 69 6e 64 65 78 0a 2a 2a 20  a cell index.** 
8d70: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
8d80: 67 75 6d 65 6e 74 20 61 6e 64 20 70 61 72 73 65  gument and parse
8d90: 43 65 6c 6c 50 74 72 28 29 20 74 61 6b 65 73 20  CellPtr() takes 
8da0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
8db0: 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 74 68 65 20  .** body of the 
8dc0: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
8dd0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
8de0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
8df0: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
8e00: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8e10: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8e20: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8e30: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e50: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8e60: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8e70: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8e80: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8e90: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8ea0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 20   */.){.  int n; 
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73   /* Number bytes
8ed0: 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   in cell content
8ee0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
8ef0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
8f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8f10: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
8f20: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 70 49  payload */..  pI
8f30: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
8f40: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
8f50: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
8f60: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
8f70: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
8f80: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
8f90: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
8fa0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
8fb0: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
8fc0: 61 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  a ){.    n += ge
8fd0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8fe0: 5b 6e 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  [n], &nPayload);
8ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
9000: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a  ayload = 0;.  }.
9010: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
9020: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28   nPayload;.  if(
9030: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
9040: 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  {.    n += getVa
9050: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
9060: 28 75 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e  (u64 *)&pInfo->n
9070: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
9080: 20 20 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20     u32 x;.    n 
9090: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
90a0: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20  pCell[n], &x);. 
90b0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
90c0: 20 78 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   x;.    nPayload
90d0: 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e   += x;.  }.  pIn
90e0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
90f0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9100: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
9110: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9120: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9130: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9140: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9150: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9160: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9170: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9180: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9190: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
91a0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
91b0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
91c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
91d0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
91e0: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
91f0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  */.    pInfo->nL
9200: 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  ocal = nPayload;
9210: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
9220: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e  rflow = 0;.    n
9230: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
9240: 2b 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  + n;.    if( nSi
9250: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53  ze<4 ){.      nS
9260: 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20  ize = 4;        
9270: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
9280: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20  size is 4 */.   
9290: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53   }.    pInfo->nS
92a0: 69 7a 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d  ize = nSize;.  }
92b0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
92c0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
92d0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
92e0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
92f0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9300: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
9310: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
9320: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
9330: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
9340: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
9350: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
9360: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
9370: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
9380: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
9390: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
93a0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
93b0: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
93c0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
93d0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
93e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
93f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9400: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
9410: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
9420: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
9430: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
9440: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
9450: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
9460: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
9470: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
9480: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
9490: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
94a0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
94b0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
94c0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
94d0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
94e0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
94f0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
9500: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
9510: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
9520: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
9530: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
9540: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
9550: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
9560: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9570: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
9580: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
9590: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
95a0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
95b0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
95c0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
95d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
95e0: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
95f0: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
9600: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
9610: 6f 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a  ocal = surplus;.
9620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9630: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9640: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
9650: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
9660: 72 66 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e  rflow = pInfo->n
9670: 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70  Local + n;.    p
9680: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
9690: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
96a0: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
96b0: 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c 28   void parseCell(
96c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
96d0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
96e0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
96f0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
9700: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
9710: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
9720: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
9730: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
9740: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9750: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9760: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9770: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
9780: 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43  Ptr(pPage, findC
9790: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
97a0: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
97b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
97c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
97d0: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
97e0: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
97f0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
9800: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
9810: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
9820: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
9830: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9840: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
9850: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
9860: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
9870: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
9880: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
9890: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
98a0: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  r..*/.#ifndef ND
98b0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
98c0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
98d0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
98e0: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
98f0: 69 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c  info;.  parseCel
9900: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
9910: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
9920: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23   info.nSize;.}.#
9930: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
9940: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
9950: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9960: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
9970: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 70 61 72 73  nfo info;.  pars
9980: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
9990: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
99a0: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
99b0: 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ze;.}..#ifndef S
99c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
99d0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
99e0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
99f0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
9a00: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
9a10: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
9a20: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
9a30: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
9a40: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
9a50: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9a60: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9a70: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
9a80: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
9a90: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
9aa0: 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65  Cell){.  if( pCe
9ab0: 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  ll ){.    CellIn
9ac0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 61 72  fo info;.    par
9ad0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
9ae0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
9af0: 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
9b00: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
9b10: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
9b20: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
9b30: 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28  oad );.    if( (
9b40: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
9b50: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
9b60: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
9b70: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  cal ){.      Pgn
9b80: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
9b90: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
9ba0: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
9bb0: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
9bc0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
9bd0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
9be0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
9bf0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
9c00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9c10: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ;.}./*.** If the
9c20: 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78   cell with index
9c30: 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70   iCell on page p
9c40: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
9c50: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
9c60: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
9c70: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
9c80: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
9c90: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
9ca0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
9cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
9cc0: 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61  mapPutOvfl(MemPa
9cd0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
9ce0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65  Cell){.  u8 *pCe
9cf0: 6c 6c 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  ll;.  pCell = fi
9d00: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
9d10: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20  Page, iCell);.  
9d20: 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74  return ptrmapPut
9d30: 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
9d40: 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Cell);.}.#endif.
9d50: 0a 0a 2f 2a 20 41 20 62 75 6e 63 68 20 6f 66 20  ../* A bunch of 
9d60: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
9d70: 6e 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68 65  nts to check the
9d80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
9d90: 74 65 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  te variables.** 
9da0: 6f 66 20 68 61 6e 64 6c 65 20 70 20 28 74 79 70  of handle p (typ
9db0: 65 20 42 74 72 65 65 2a 29 20 61 72 65 20 69 6e  e Btree*) are in
9dc0: 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
9dd0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
9de0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
9df0: 29 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ) \.  assert( p-
9e00: 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
9e10: 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42 74 2d 3e  NONE || p->pBt->
9e20: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 70 2d 3e  nTransaction<p->
9e30: 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20  pBt->nRef ); \. 
9e40: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
9e50: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3c 3d 70  >nTransaction<=p
9e60: 2d 3e 70 42 74 2d 3e 6e 52 65 66 20 29 3b 20 5c  ->pBt->nRef ); \
9e70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
9e80: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
9e90: 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 7c 7c 20  !=TRANS_NONE || 
9ea0: 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  p->pBt->nTransac
9eb0: 74 69 6f 6e 3d 3d 30 20 29 3b 20 5c 0a 20 20 61  tion==0 ); \.  a
9ec0: 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69  ssert( p->pBt->i
9ed0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 3d 70 2d  nTransaction>=p-
9ee0: 3e 69 6e 54 72 61 6e 73 20 29 3b 20 0a 0a 2f 2a  >inTrans ); ../*
9ef0: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
9f00: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
9f10: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
9f20: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
9f30: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
9f40: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
9f50: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
9f60: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
9f70: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
9f80: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
9f90: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
9fa0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
9fb0: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
9fc0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a  ontent area..*/.
9fd0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
9fe0: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
9ff0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
a000: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a010: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a020: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
a030: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
a040: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
a050: 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c  ss of a i-th cel
a060: 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  l */.  int addr;
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
a090: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
a0a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a0b0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ay */.  int hdr;
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
a0e0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
a0f0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
a120: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
a130: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
a140: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
a150: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
a160: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
a170: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
a180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a190: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
a1a0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
a1b0: 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20  nt brk;         
a1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
a1d0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
a1e0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
a1f0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a210: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
a220: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
a230: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a240: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
a250: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
a260: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a270: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
a280: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
a290: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ll content */.. 
a2a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a2b0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a2c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a2e0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a2f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a300: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a310: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
a320: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
a330: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
a340: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 65  rflow==0 );.  te
a350: 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mp = sqliteMallo
a360: 63 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  c( pPage->pBt->p
a370: 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  ageSize );.  if(
a380: 20 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75 72   temp==0 ) retur
a390: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a3a0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
a3b0: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
a3c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a3d0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
a3e0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
a3f0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
a400: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
a410: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
a420: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
a430: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
a440: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
a450: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62  >usableSize;.  b
a460: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
a470: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
a480: 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d  emcpy(&temp[brk]
a490: 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
a4a0: 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b  ableSize - brk);
a4b0: 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53  .  brk = usableS
a4c0: 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ize;.  for(i=0; 
a4d0: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
a4e0: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
a4f0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
a500: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
a510: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
a520: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
a530: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
a540: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
a550: 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67   assert( pc<pPag
a560: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a570: 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  ze );.    size =
a580: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
a590: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
a5a0: 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b      brk -= size;
a5b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
a5c0: 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  a[brk], &temp[pc
a5d0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
a5e0: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72  t2byte(pAddr, br
a5f0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
a600: 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65  ( brk>=cellOffse
a610: 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  t+2*nCell );.  p
a620: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a630: 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61  r+5], brk);.  da
a640: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
a650: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
a660: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
a670: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
a680: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
a690: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
a6a0: 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61  [addr], 0, brk-a
a6b0: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ddr);.  sqliteFr
a6c0: 65 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74 75  ee(temp);.  retu
a6d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a6e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
a6f0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
a700: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
a710: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
a720: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
a730: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
a740: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
a750: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
a760: 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72 6e  ation. Or return
a770: 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   0 if there is n
a780: 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a 2a  ot enough free.*
a790: 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  * space on the p
a7a0: 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20 74  age to satisfy t
a7b0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65  he allocation re
a7c0: 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  quest..**.** If 
a7d0: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
a7e0: 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65  s nBytes of free
a7f0: 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20   space but does 
a800: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  not contain.** n
a810: 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75  Bytes of contigu
a820: 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20  ous free space, 
a830: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
a840: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  e automatically.
a850: 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65  ** calls defrage
a860: 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f  mentPage() to co
a870: 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72  nsolidate all fr
a880: 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ee space before 
a890: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74  .** allocating t
a8a0: 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f  he new chunk..*/
a8b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
a8c0: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
a8d0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
a8e0: 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  yte){.  int addr
a8f0: 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74  , pc, hdr;.  int
a900: 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72   size;.  int nFr
a910: 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20  ag;.  int top;. 
a920: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
a930: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  t cellOffset;.  
a940: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
a950: 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d  ata;.  .  data =
a960: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
a970: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a980: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a990: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a9a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
a9b0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 69 66  age->pBt );.  if
a9c0: 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74  ( nByte<4 ) nByt
a9d0: 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61  e = 4;.  if( pPa
a9e0: 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20  ge->nFree<nByte 
a9f0: 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  || pPage->nOverf
aa00: 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30  low>0 ) return 0
aa10: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
aa20: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72   -= nByte;.  hdr
aa30: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
aa40: 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  set;..  nFrag = 
aa50: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
aa60: 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20  f( nFrag<60 ){. 
aa70: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
aa80: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
aa90: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
aaa0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
aab0: 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70  fy the.    ** sp
aac0: 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a  ace request. */.
aad0: 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31      addr = hdr+1
aae0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63  ;.    while( (pc
aaf0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ab00: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
ab10: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
ab20: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
ab30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
ab40: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
ab50: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79      if( size<nBy
ab60: 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  te+4 ){.        
ab70: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
ab80: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
ab90: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
aba0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72  ata[hdr+7] = nFr
abb0: 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  ag + size - nByt
abc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e;.          ret
abd0: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
abe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
abf0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ac00: 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74  pc+2], size-nByt
ac10: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
ac20: 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d  turn pc + size -
ac30: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
ac40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ac50: 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d  addr = pc;.    }
ac60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
ac70: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
ac80: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
ac90: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
aca0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
acb0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
acc0: 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20  ent area..  */. 
acd0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
ace0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
acf0: 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
ad00: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
ad10: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
ad20: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
ad30: 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  t;.  if( nFrag>=
ad40: 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74  60 || cellOffset
ad50: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70   + 2*nCell > top
ad60: 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20   - nByte ){.    
ad70: 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61  if( defragmentPa
ad80: 67 65 28 70 50 61 67 65 29 20 29 20 72 65 74 75  ge(pPage) ) retu
ad90: 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20  rn 0;.    top = 
ada0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
adb0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f  dr+5]);.  }.  to
adc0: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73  p -= nByte;.  as
add0: 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74  sert( cellOffset
ade0: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f   + 2*nCell <= to
adf0: 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  p );.  put2byte(
ae00: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
ae10: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70  p);.  return top
ae20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ae30: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
ae40: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
ae50: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
ae60: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
ae70: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
ae80: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
ae90: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
aea0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
aeb0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
aec0: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
aed0: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
aee0: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
aef0: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
af00: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
af10: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
af20: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
af30: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
af40: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53 70  atic void freeSp
af50: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
af60: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
af70: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
af80: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
af90: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
afa0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
afb0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
afc0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
afd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
afe0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
aff0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
b000: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b010: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
b020: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
b030: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
b040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
b050: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
b060: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b070: 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69 7a  ize );.  if( siz
b080: 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b 0a  e<4 ) size = 4;.
b090: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
b0a0: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
b0b0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
b0c0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
b0d0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
b0e0: 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54  the SECURE_DELET
b0f0: 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  E .  ** option i
b100: 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
b110: 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d  pile-time */.  m
b120: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
b130: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65  t], 0, size);.#e
b140: 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
b150: 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e  he space back in
b160: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
b170: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
b180: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
b190: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b1a0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
b1b0: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
b1c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b1d0: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
b1e0: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
b1f0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
b200: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
b210: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
b220: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
b230: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64  n>addr );.    ad
b240: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d  dr = pbegin;.  }
b250: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
b260: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
b270: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
b280: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
b290: 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d  addr || pbegin==
b2a0: 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  0 );.  put2byte(
b2b0: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61  &data[addr], sta
b2c0: 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  rt);.  put2byte(
b2d0: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62  &data[start], pb
b2e0: 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74  egin);.  put2byt
b2f0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d  e(&data[start+2]
b300: 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  , size);.  pPage
b310: 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b  ->nFree += size;
b320: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
b330: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
b340: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
b350: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b360: 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  t + 1;.  while( 
b370: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
b380: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
b390: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
b3a0: 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20  ext, psize;.    
b3b0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
b3c0: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
b3d0: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
b3e0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b3f0: 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74  e-4 );.    pnext
b400: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b410: 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20  a[pbegin]);.    
b420: 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  psize = get2byte
b430: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
b440: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
b450: 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d  n + psize + 3 >=
b460: 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e   pnext && pnext>
b470: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  0 ){.      int f
b480: 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70  rag = pnext - (p
b490: 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20  begin+psize);.  
b4a0: 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67      assert( frag
b4b0: 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  <=data[pPage->hd
b4c0: 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20  rOffset+7] );.  
b4d0: 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e      data[pPage->
b4e0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20  hdrOffset+7] -= 
b4f0: 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32  frag;.      put2
b500: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b510: 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61  n], get2byte(&da
b520: 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20  ta[pnext]));.   
b530: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b540: 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65  a[pbegin+2], pne
b550: 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74  xt+get2byte(&dat
b560: 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67  a[pnext+2])-pbeg
b570: 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  in);.    }else{.
b580: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
b590: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
b5a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
b5b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
b5c0: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
b5d0: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
b5e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
b5f0: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
b600: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
b610: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
b620: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
b630: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
b640: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b650: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
b660: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
b670: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
b680: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
b690: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b6a0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
b6b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
b6c0: 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  p + get2byte(&da
b6d0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a  ta[pbegin+2]));.
b6e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63    }.}../*.** Dec
b6f0: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
b700: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
b710: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
b720: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
b730: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
b740: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
b750: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
b760: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
b770: 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64  tatic void decod
b780: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
b790: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
b7a0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
b7b0: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
b7c0: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
b7d0: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
b7e0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b7f0: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
b800: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
b810: 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  .  pPage->intKey
b820: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28   = (flagByte & (
b830: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
b840: 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20  EAFDATA))!=0;.  
b850: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
b860: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54  = (flagByte & PT
b870: 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a  F_ZERODATA)!=0;.
b880: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b890: 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f  (flagByte & PTF_
b8a0: 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67  LEAF)!=0;.  pPag
b8b0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
b8c0: 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66  = 4*(pPage->leaf
b8d0: 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  ==0);.  pBt = pP
b8e0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
b8f0: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
b900: 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70  EAFDATA ){.    p
b910: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d  Page->leafData =
b920: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   1;.    pPage->m
b930: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b940: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
b950: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b960: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
b970: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  lse{.    pPage->
b980: 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20  leafData = 0;.  
b990: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b9a0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
b9b0: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
b9c0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b9d0: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  nLocal;.  }.  pP
b9e0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21  age->hasData = !
b9f0: 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61  (pPage->zeroData
ba00: 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61   || (!pPage->lea
ba10: 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66  f && pPage->leaf
ba20: 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Data));.}../*.**
ba30: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ba40: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
ba50: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
ba60: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   block..**.** Th
ba70: 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
ba80: 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ter must be a po
ba90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
baa0: 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  Page which.** is
bab0: 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
bac0: 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e  he page being in
bad0: 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
bae0: 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72  root of a.** BTr
baf0: 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74  ee has no parent
bb00: 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74   and so for that
bb10: 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d   page, pParent==
bb20: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  NULL..**.** Retu
bb30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
bb40: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
bb50: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
bb60: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
bb70: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
bb80: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
bb90: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
bba0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
bbb0: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
bbc0: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
bbd0: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
bbe0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
bbf0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
bc00: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
bc10: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
bc20: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
bc30: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
bc40: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
bc50: 20 69 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d   initPage(.  Mem
bc60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
bc70: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
bc80: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
bc90: 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
bca0: 70 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a  pParent       /*
bcb0: 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69   The parent.  Mi
bcc0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
bcd0: 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
bce0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
bcf0: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
bd00: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
bd10: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Data[] */.  int 
bd20: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  hdr;           /
bd30: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
bd40: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
bd50: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
bd60: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
bd70: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
bd80: 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61  aData */.  BtSha
bd90: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
bda0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
bdb0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
bdc0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
bdd0: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
bde0: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
bdf0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
be00: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
be10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
be20: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
be30: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
be40: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
be50: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
be60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
be70: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
be80: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
be90: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
bea0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
beb0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bec0: 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20  rea */..  pBt = 
bed0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
bee0: 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a  sert( pBt!=0 );.
bef0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
bf00: 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  t==0 || pParent-
bf10: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61  >pBt==pBt );.  a
bf20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
bf30: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
bf40: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
bf50: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
bf60: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
bf70: 44 61 74 61 20 3d 3d 20 26 28 28 75 6e 73 69 67  Data == &((unsig
bf80: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 29  ned char*)pPage)
bf90: 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  [-pBt->pageSize]
bfa0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
bfb0: 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e  >pParent!=pParen
bfc0: 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61  t && (pPage->pPa
bfd0: 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65  rent!=0 || pPage
bfe0: 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20  ->isInit) ){.   
bff0: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70   /* The parent p
c000: 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  age should never
c010: 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74   change unless t
c020: 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  he file is corru
c030: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
c040: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c050: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
c060: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20  pPage->isInit ) 
c070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c080: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
c090: 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61  Parent==0 && pPa
c0a0: 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70  rent!=0 ){.    p
c0b0: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
c0c0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
c0d0: 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
c0e0: 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
c0f0: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
c100: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
c110: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c120: 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  ata;.  decodeFla
c130: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
c140: 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  dr]);.  pPage->n
c150: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c160: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
c170: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
c180: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
c190: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
c1a0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
c1b0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
c1c0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
c1d0: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
c1e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c1f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c200: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c210: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
c220: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
c230: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
c240: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
c250: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
c260: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
c270: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
c280: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
c290: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c2a0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
c2b0: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
c2c0: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
c2d0: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
c2e0: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
c2f0: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
c300: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
c310: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
c320: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
c330: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c340: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
c350: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c360: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c370: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c380: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c390: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c3a0: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
c3b0: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
c3c0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
c3d0: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
c3e0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
c3f0: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
c400: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
c410: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
c420: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
c430: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
c440: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
c450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c460: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
c470: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
c480: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
c490: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
c4a0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
c4b0: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
c4c0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
c4d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
c4e0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
c4f0: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
c500: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
c510: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c520: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c530: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
c540: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
c550: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
c560: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
c570: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
c580: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
c590: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
c5a0: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
c5b0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
c5c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c5d0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
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 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
c600: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c610: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
c620: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
c630: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
c640: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
c650: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
c660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c670: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
c680: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
c690: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
c6a0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
c6b0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
c6c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
c6d0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 68  ge->pBt;.  int h
c6e0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c6f0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69 72  ffset;.  int fir
c700: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
c710: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
c720: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
c730: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
c740: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
c750: 26 64 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  &data[pBt->pageS
c760: 69 7a 65 5d 20 3d 3d 20 28 75 6e 73 69 67 6e 65  ize] == (unsigne
c770: 64 20 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b  d char*)pPage );
c780: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c790: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c7a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c7b0: 65 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  e) );.  memset(&
c7c0: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
c7d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c7e0: 68 64 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  hdr);.  data[hdr
c7f0: 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72  ] = flags;.  fir
c800: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c810: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c820: 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74  F)==0);.  memset
c830: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
c840: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
c850: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
c860: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c870: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c880: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
c890: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
c8a0: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
c8b0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
c8c0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
c8d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c8e0: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
c8f0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
c900: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
c910: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67  flow = 0;.  pPag
c920: 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
c930: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
c940: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
c950: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Init = 1;.}../*.
c960: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
c970: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
c980: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
c990: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
c9a0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
c9b0: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
c9c0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
c9d0: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
c9e0: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
c9f0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
ca00: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
ca10: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
ca20: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
ca30: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
ca40: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
ca50: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
ca60: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
ca70: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
ca80: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
ca90: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
caa0: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
cab0: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
cac0: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
cad0: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
cae0: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
caf0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
cb00: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
cb10: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
cb20: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
cb30: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
cb40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
cb50: 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 70  Page(BtShared *p
cb60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d  Bt, Pgno pgno, M
cb70: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
cb80: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 29 7b   int noContent){
cb90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
cba0: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44  Page *pPage;.  D
cbb0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
cbc0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
cbd0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
cbe0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
cbf0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
cc00: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
cc10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cc20: 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28   rc;.  pPage = (
cc30: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
cc40: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
cc50: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
cc60: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
cc70: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
cc80: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
cc90: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
cca0: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
ccb0: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
ccc0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
ccd0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
cce0: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
ccf0: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a  1 ? 100 : 0;.  *
cd00: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
cd10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cd20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
cd30: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cd40: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
cd50: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
cd60: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
cd70: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
cd80: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
cd90: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
cda0: 6f 0a 2a 2a 20 67 65 74 50 61 67 65 28 29 20 61  o.** getPage() a
cdb0: 6e 64 20 69 6e 69 74 50 61 67 65 28 29 2e 0a 2a  nd initPage()..*
cdc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
cdd0: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
cde0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
cdf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
ce00: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
ce10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ce20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ce30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
ce40: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
ce50: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
ce60: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
ce70: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
ce80: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
ce90: 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  t     /* Parent 
cea0: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 29  of the page */.)
ceb0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
cec0: 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
ced0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cee0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
cef0: 7d 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  }.  rc = getPage
cf00: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
cf10: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
cf20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
cf30: 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
cf40: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
cf50: 69 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  initPage(*ppPage
cf60: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
cf70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cf80: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
cf90: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
cfa0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
cfb0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
cfc0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 67  ior.** call to g
cfd0: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
cfe0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
cff0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
d000: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
d010: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d020: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d030: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d040: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
d050: 65 72 74 28 20 26 70 50 61 67 65 2d 3e 61 44 61  ert( &pPage->aDa
d060: 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ta[pPage->pBt->p
d070: 61 67 65 53 69 7a 65 5d 3d 3d 28 75 6e 73 69 67  ageSize]==(unsig
d080: 6e 65 64 20 63 68 61 72 2a 29 70 50 61 67 65 20  ned char*)pPage 
d090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d0a0: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
d0b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
d0c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d0d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d0e0: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
d0f0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
d100: 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72  e.** reaches zer
d110: 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75  o.  We need to u
d120: 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74  nref the pParent
d130: 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68   pointer when th
d140: 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a  at.** happens..*
d150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
d160: 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50  geDestructor(DbP
d170: 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  age *pData, int 
d180: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d  pageSize){.  Mem
d190: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
d1a0: 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
d1b0: 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50   & 7)==0 );.  pP
d1c0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d1d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d1e0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d1f0: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
d200: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
d210: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
d220: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
d230: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
d240: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
d250: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
d260: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
d270: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
d280: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
d290: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
d2a0: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
d2b0: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
d2c0: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
d2d0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
d2e0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
d2f0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
d300: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d310: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
d320: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
d330: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
d340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d360: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
d370: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
d380: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
d390: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
d3a0: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
d3b0: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
d3c0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d3d0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
d3e0: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
d3f0: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
d400: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
d410: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
d420: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
d430: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
d440: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
d450: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
d460: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
d470: 69 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  it ){.    pPage-
d480: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
d490: 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c   initPage(pPage,
d4a0: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
d4b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ;.  }.}../*.** O
d4c0: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
d4d0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
d4e0: 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
d4f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d500: 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
d510: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
d520: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d530: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61  with a random na
d540: 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  me is created.  
d550: 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61  This randomly na
d560: 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  med.** database 
d570: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
d580: 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65  eted when sqlite
d590: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
d5a0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20   called..*/.int 
d5b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
d5c0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
d5d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
d5e0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
d5f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
d600: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
d610: 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 53 71 6c  .  sqlite3 *pSql
d620: 69 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 41 73  ite,       /* As
d630: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
d640: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
d650: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
d660: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
d670: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
d680: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
d690: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6b0: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  * Options */.){.
d6c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
d6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
d6e0: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
d6f0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
d700: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
d710: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
d720: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
d730: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d740: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73  E_OK;.  int nRes
d750: 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  erve;.  unsigned
d760: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
d770: 31 30 30 5d 3b 0a 23 69 66 20 21 64 65 66 69 6e  100];.#if !defin
d780: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
d790: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
d7a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d7b0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 63  OMIT_DISKIO).  c
d7c0: 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
d7d0: 2a 70 54 73 64 72 6f 3b 0a 23 65 6e 64 69 66 0a  *pTsdro;.#endif.
d7e0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
d7f0: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
d800: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
d810: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
d820: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
d830: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
d840: 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  d database. This
d850: 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20   symbol is only 
d860: 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a  required if.  **
d870: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
d880: 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75  hared-data or au
d890: 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65  tovacuum feature
d8a0: 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a  s are compiled .
d8b0: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69    ** into the li
d8c0: 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  brary..  */.#if 
d8d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d8e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
d8f0: 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  E) || !defined(S
d900: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d910: 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20  ACUUM).  #ifdef 
d920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
d930: 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69  RYDB.    const i
d940: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
d950: 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73    #else.    cons
d960: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
d970: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74  zFilename && !st
d980: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
d990: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23  ":memory:");.  #
d9a0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
d9b0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
d9c0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
d9d0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
d9e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d9f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
da00: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
da10: 4f 4e 45 3b 0a 20 20 70 2d 3e 70 53 71 6c 69 74  ONE;.  p->pSqlit
da20: 65 20 3d 20 70 53 71 6c 69 74 65 3b 0a 0a 20 20  e = pSqlite;..  
da30: 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
da40: 6e 20 65 78 69 73 74 69 6e 67 20 42 74 72 65 65  n existing Btree
da50: 20 73 74 72 75 63 74 75 72 65 20 6f 70 65 6e 65   structure opene
da60: 64 20 6f 6e 20 7a 46 69 6c 65 6e 61 6d 65 2e 20  d on zFilename. 
da70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
da80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
da90: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
daa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
dab0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 70 54 73 64  T_DISKIO).  pTsd
dac0: 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  ro = sqlite3Thre
dad0: 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
dae0: 3b 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d 3e  ;.  if( pTsdro->
daf0: 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26 26  useSharedData &&
db00: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
db10: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 63 68  sMemdb ){.    ch
db20: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
db30: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
db40: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
db50: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ame);.    if( !z
db60: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
db70: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
db80: 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
db90: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
dba0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 42      }.    for(pB
dbb0: 74 3d 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65  t=pTsdro->pBtree
dbc0: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
dbd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
dbe0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
dbf0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  0 );.      if( 0
dc00: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
dc10: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
dc20: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
dc30: 2d 3e 70 50 61 67 65 72 29 29 20 29 7b 0a 20 20  ->pPager)) ){.  
dc40: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
dc50: 42 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 42  Bt;.        *ppB
dc60: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  tree = p;.      
dc70: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
dc80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
dc90: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
dca0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
dcb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
dcc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
dcd0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
dce0: 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  thname);.  }.#en
dcf0: 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  dif..  /*.  ** T
dd00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
dd10: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
dd20: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
dd30: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
dd40: 20 61 72 65 0a 20 20 2a 2a 20 74 68 65 20 72 69   are.  ** the ri
dd50: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
dd60: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
dd70: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
dd80: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 2a   that result.  *
dd90: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
dda0: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
ddb0: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
ddc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  */.  assert( siz
ddd0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
dde0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
ddf0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
de00: 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(u64)==8 || siz
de10: 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(u64)==4 );. 
de20: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
de30: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73  u32)==4 );.  ass
de40: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
de50: 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
de60: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
de70: 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 73 71 6c   );..  pBt = sql
de80: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
de90: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 69 66 28  f(*pBt) );.  if(
dea0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pBt==0 ){.    r
deb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
dec0: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65  ;.    goto btree
ded0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20  _open_out;.  }. 
dee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
def0: 65 72 4f 70 65 6e 28 26 70 42 74 2d 3e 70 50 61  erOpen(&pBt->pPa
df00: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger, zFilename, 
df10: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
df20: 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
df30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
df40: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
df50: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
df60: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
df70: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
df80: 48 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 69  Header);.  }.  i
df90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dfa0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 74 72   ){.    goto btr
dfb0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 7d  ee_open_out;.  }
dfc0: 0a 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b  .  p->pBt = pBt;
dfd0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
dfe0: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42  SetDestructor(pB
dff0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44  t->pPager, pageD
e000: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 73 71  estructor);.  sq
e010: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
e020: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
e030: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
e040: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
e050: 20 30 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   0;.  pBt->pPage
e060: 31 20 3d 20 30 3b 0a 20 20 70 42 74 2d 3e 72 65  1 = 0;.  pBt->re
e070: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
e080: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
e090: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e0a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
e0b0: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
e0c0: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20  der[16]);.  if( 
e0d0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
e0e0: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
e0f0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
e100: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 7c  GE_SIZE.       |
e110: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
e120: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
e130: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 42  ze)!=0 ){.    pB
e140: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  t->pageSize = SQ
e150: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
e160: 45 5f 53 49 5a 45 3b 0a 20 20 20 20 70 42 74 2d  E_SIZE;.    pBt-
e170: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20  >maxEmbedFrac = 
e180: 36 34 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a  64;   /* 25% */.
e190: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
e1a0: 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a  dFrac = 32;   /*
e1b0: 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 70 42   12.5% */.    pB
e1c0: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
e1d0: 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35 25   32;    /* 12.5%
e1e0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
e1f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
e200: 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  UM.    /* If the
e210: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
e220: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
e230: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
e240: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
e250: 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
e260: 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
e270: 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
e280: 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
e290: 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
e2a0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e2b0: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
e2c0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
e2d0: 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
e2e0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
e2f0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
e300: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
e310: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 2a   is just a.    *
e320: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
e330: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
e340: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
e350: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
e360: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 2a 2f 0a   normal..    */.
e370: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
e380: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
e390: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
e3a0: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
e3b0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e3c0: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
e3d0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
e3e0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
e3f0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e400: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
e410: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e    }.#endif.    n
e420: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 7d  Reserve = 0;.  }
e430: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 65 72  else{.    nReser
e440: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
e450: 30 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  0];.    pBt->max
e460: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
e470: 65 61 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 70  eader[21];.    p
e480: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
e490: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d   = zDbHeader[22]
e4a0: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  ;.    pBt->minLe
e4b0: 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64  afFrac = zDbHead
e4c0: 65 72 5b 32 33 5d 3b 0a 20 20 20 20 70 42 74 2d  er[23];.    pBt-
e4d0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
e4e0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
e4f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
e500: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
e510: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
e520: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
e530: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 4*4])?1:0);.#
e540: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 42 74 2d  endif.  }.  pBt-
e550: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
e560: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
e570: 65 73 65 72 76 65 3b 0a 20 20 61 73 73 65 72 74  eserve;.  assert
e580: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
e590: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
e5a0: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
e5b0: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
e5c0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e5d0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
e5e0: 50 61 67 65 72 2c 20 70 42 74 2d 3e 70 61 67 65  Pager, pBt->page
e5f0: 53 69 7a 65 29 3b 0a 0a 23 69 66 20 21 64 65 66  Size);..#if !def
e600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e610: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e620: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e630: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e640: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
e650: 62 74 72 65 65 20 74 6f 20 74 68 65 20 6c 69 6e  btree to the lin
e660: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
e670: 67 20 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  g at ThreadData.
e680: 70 42 74 72 65 65 2e 0a 20 20 2a 2a 20 54 68 65  pBtree..  ** The
e690: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
e6a0: 74 68 61 74 20 61 20 6d 61 6c 6c 6f 63 28 29 20  that a malloc() 
e6b0: 6d 61 79 20 66 61 69 6c 20 69 6e 73 69 64 65 20  may fail inside 
e6c0: 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 71 6c  of the .  ** sql
e6d0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
e6e0: 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 54 68   call, as the Th
e6f0: 72 65 61 64 44 61 74 61 20 73 74 72 75 63 74 75  readData structu
e700: 72 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  re must have alr
e710: 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 61  eady.  ** been a
e720: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 70 54 73  llocated for pTs
e730: 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44 61  dro->useSharedDa
e740: 74 61 20 74 6f 20 62 65 20 6e 6f 6e 2d 7a 65 72  ta to be non-zer
e750: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  o..  */.  if( pT
e760: 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65 64 44  sdro->useSharedD
e770: 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ata && zFilename
e780: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
e790: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
e7a0: 20 70 54 73 64 72 6f 2d 3e 70 42 74 72 65 65 3b   pTsdro->pBtree;
e7b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
e7c0: 61 64 44 61 74 61 28 29 2d 3e 70 42 74 72 65 65  adData()->pBtree
e7d0: 20 3d 20 70 42 74 3b 0a 20 20 7d 0a 23 65 6e 64   = pBt;.  }.#end
e7e0: 69 66 0a 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  if.  pBt->nRef =
e7f0: 20 31 3b 0a 20 20 2a 70 70 42 74 72 65 65 20 3d   1;.  *ppBtree =
e800: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
e810: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
e820: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e830: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
e840: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
e850: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
e860: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
e870: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e880: 46 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  Free(pBt);.    s
e890: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20  qliteFree(p);.  
e8a0: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
e8b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e8d0: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
e8e0: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
e8f0: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
e900: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e910: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
e920: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e930: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
e940: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 23 69  ursor *pCur;..#i
e950: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e960: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
e970: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
e980: 64 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  d;.#endif..  /* 
e990: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
e9a0: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
e9b0: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
e9c0: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
e9d0: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
e9e0: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
e9f0: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
ea00: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
ea10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
ea20: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
ea30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ea40: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
ea50: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
ea60: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
ea70: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
ea80: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
ea90: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
eaa0: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
eab0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
eac0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
ead0: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
eae0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
eaf0: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
eb00: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
eb10: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
eb20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
eb30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eb40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
eb50: 48 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  HE.  /* If there
eb60: 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
eb70: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
eb80: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
eb90: 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
eba0: 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
ebb0: 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
ebc0: 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
ebd0: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
ebe0: 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
ebf0: 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
ec00: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
ec10: 65 66 3e 30 20 29 3b 0a 20 20 70 42 74 2d 3e 6e  ef>0 );.  pBt->n
ec20: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
ec30: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 72 65  ->nRef ){.    re
ec40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ec50: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
ec60: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
ec70: 65 20 66 72 6f 6d 20 74 68 65 20 74 68 72 65 61  e from the threa
ec80: 64 20 77 69 64 65 20 6c 69 73 74 2e 20 43 61 6c  d wide list. Cal
ec90: 6c 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  l .  ** ThreadDa
eca0: 74 61 52 65 61 64 4f 6e 6c 79 28 29 20 61 6e 64  taReadOnly() and
ecb0: 20 74 68 65 6e 20 63 61 73 74 20 61 77 61 79 20   then cast away 
ecc0: 74 68 65 20 63 6f 6e 73 74 20 70 72 6f 70 65 72  the const proper
ecd0: 74 79 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ty of the .  ** 
ece0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64  pointer to avoid
ecf0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 72 65   allocating thre
ed00: 61 64 20 64 61 74 61 20 69 66 20 69 74 20 69 73  ad data if it is
ed10: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 72 65 71 75   not really requ
ed20: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 73  ired..  */.  pTs
ed30: 64 20 3d 20 28 54 68 72 65 61 64 44 61 74 61 20  d = (ThreadData 
ed40: 2a 29 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  *)sqlite3ThreadD
ed50: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
ed60: 20 69 66 28 20 70 54 73 64 2d 3e 70 42 74 72 65   if( pTsd->pBtre
ed70: 65 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 61 73  e==pBt ){.    as
ed80: 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69  sert( pTsd==sqli
ed90: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
eda0: 29 3b 0a 20 20 20 20 70 54 73 64 2d 3e 70 42 74  );.    pTsd->pBt
edb0: 72 65 65 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ree = pBt->pNext
edc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 42  ;.  }else{.    B
edd0: 74 53 68 61 72 65 64 20 2a 70 50 72 65 76 3b 0a  tShared *pPrev;.
ede0: 20 20 20 20 66 6f 72 28 70 50 72 65 76 3d 70 54      for(pPrev=pT
edf0: 73 64 2d 3e 70 42 74 72 65 65 3b 20 70 50 72 65  sd->pBtree; pPre
ee00: 76 20 26 26 20 70 50 72 65 76 2d 3e 70 4e 65 78  v && pPrev->pNex
ee10: 74 21 3d 70 42 74 3b 20 70 50 72 65 76 3d 70 50  t!=pBt; pPrev=pP
ee20: 72 65 76 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  rev->pNext){}.  
ee30: 20 20 69 66 28 20 70 50 72 65 76 20 29 7b 0a 20    if( pPrev ){. 
ee40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73       assert( pTs
ee50: 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61 64  d==sqlite3Thread
ee60: 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 20 20  Data() );.      
ee70: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
ee80: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
ee90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
eea0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 70 61 67 65  * Close the page
eeb0: 72 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 73  r and free the s
eec0: 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
eed0: 63 74 75 72 65 20 2a 2f 0a 20 20 61 73 73 65 72  cture */.  asser
eee0: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
eef0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
ef00: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
ef10: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  ger);.  if( pBt-
ef20: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
ef30: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
ef40: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
ef50: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
ef60: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
ef70: 46 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d  Free(pBt->pSchem
ef80: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
ef90: 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
efa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
efb0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 62  .** Change the b
efc0: 75 73 79 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy handler call
efd0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  back function..*
efe0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
eff0: 65 65 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72  eeSetBusyHandler
f000: 28 42 74 72 65 65 20 2a 70 2c 20 42 75 73 79 48  (Btree *p, BusyH
f010: 61 6e 64 6c 65 72 20 2a 70 48 61 6e 64 6c 65 72  andler *pHandler
f020: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f030: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 70  Bt = p->pBt;.  p
f040: 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  Bt->pBusyHandler
f050: 20 3d 20 70 48 61 6e 64 6c 65 72 3b 0a 20 20 73   = pHandler;.  s
f060: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
f070: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
f080: 50 61 67 65 72 2c 20 70 48 61 6e 64 6c 65 72 29  Pager, pHandler)
f090: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f0a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f0b0: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
f0c0: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
f0d0: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
f0e0: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
f0f0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
f100: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
f110: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
f120: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
f130: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
f140: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
f150: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
f160: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
f170: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
f180: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
f190: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
f1a0: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
f1b0: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
f1c0: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
f1d0: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
f1e0: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
f1f0: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
f200: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
f210: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
f220: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
f230: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
f240: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
f250: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
f260: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
f270: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
f280: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
f290: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
f2a0: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
f2b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
f2c0: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
f2d0: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
f2e0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
f2f0: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
f300: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
f310: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
f320: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
f330: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f340: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
f350: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
f360: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f370: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
f380: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
f390: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
f3a0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f3b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
f3c0: 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
f3d0: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
f3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f3f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
f400: 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
f410: 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
f420: 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
f430: 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
f440: 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
f450: 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
f460: 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
f470: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
f480: 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
f490: 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
f4a0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
f4b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
f4c0: 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
f4d0: 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
f4e0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
f4f0: 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
f500: 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
f510: 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
f520: 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
f530: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
f540: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
f550: 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
f560: 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
f570: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
f580: 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
f590: 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
f5a0: 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
f5b0: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
f5c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
f5d0: 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
f5e0: 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66 65  ite3BtreeSetSafe
f5f0: 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70  tyLevel(Btree *p
f600: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
f610: 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74   fullSync){.  Bt
f620: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
f630: 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  >pBt;.  sqlite3P
f640: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
f650: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
f660: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
f670: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f680: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
f690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f6a0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
f6b0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
f6c0: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
f6d0: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
f6e0: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
f6f0: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
f700: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
f710: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
f720: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
f730: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
f740: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f750: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
f760: 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
f770: 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 65 74  >pPager );.  ret
f780: 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
f790: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
f7a0: 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  er);.}..#if !def
f7b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f7c0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
f7d0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
f7e0: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
f7f0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
f800: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
f810: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
f820: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
f830: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
f840: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
f850: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
f860: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
f870: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
f880: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
f890: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
f8a0: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
f8b0: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
f8c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
f8d0: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
f8e0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
f8f0: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
f900: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
f910: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
f920: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
f930: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f940: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
f950: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
f960: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
f970: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
f980: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
f990: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
f9a0: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
f9b0: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
f9c0: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
f9d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
f9e0: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
f9f0: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
fa00: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
fa10: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
fa20: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
fa30: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
fa40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa50: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
fa60: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
fa70: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
fa80: 73 65 72 76 65 29 7b 0a 20 20 42 74 53 68 61 72  serve){.  BtShar
fa90: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
faa0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
fab0: 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
fac0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fad0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
fae0: 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
faf0: 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
fb00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
fb10: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fb20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65  ;.  }.  if( page
fb30: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
fb40: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
fb50: 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
fb60: 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
fb70: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
fb80: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
fb90: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
fba0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
fbb0: 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
fbc0: 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
fbd0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
fbe0: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Size = sqlite3Pa
fbf0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
fc00: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
fc10: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
fc20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
fc30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
fc40: 52 65 73 65 72 76 65 3b 0a 20 20 72 65 74 75 72  Reserve;.  retur
fc50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fc60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
fc70: 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
fc80: 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
fc90: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
fca0: 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
fcb0: 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
fcc0: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
fcd0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
fce0: 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
fcf0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
fd00: 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
fd10: 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
fd20: 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ableSize;.}.#end
fd30: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
fd40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
fd50: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
fd60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fd70: 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
fd80: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
fd90: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
fda0: 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
fdb0: 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
fdc0: 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
fdd0: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
fde0: 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
fdf0: 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
fe00: 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
fe10: 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
fe20: 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
fe30: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
fe40: 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
fe50: 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
fe60: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
fe70: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
fe80: 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
fe90: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
fea0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
feb0: 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
fec0: 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
fed0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
fee0: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
fef0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
ff00: 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
ff10: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ff20: 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f    int av = (auto
ff30: 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 20 20 69  Vacuum?1:0);.  i
ff40: 6e 74 20 69 76 20 3d 20 28 61 75 74 6f 56 61 63  nt iv = (autoVac
ff50: 75 75 6d 3d 3d 42 54 52 45 45 5f 41 55 54 4f 56  uum==BTREE_AUTOV
ff60: 41 43 55 55 4d 5f 49 4e 43 52 3f 31 3a 30 29 3b  ACUUM_INCR?1:0);
ff70: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
ff80: 53 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21  SizeFixed && av!
ff90: 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
ffa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ffb0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
ffc0: 20 20 7d 0a 20 20 70 42 74 2d 3e 61 75 74 6f 56    }.  pBt->autoV
ffd0: 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 70 42  acuum = av;.  pB
ffe0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
fff0: 69 76 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  iv;.  return SQL
10000 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  ITE_OK;.#endif.}
10010 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10020 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
10030 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
10040 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
10050 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
10060 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
10070 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
10080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10090 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
100a0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
100b0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
100c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
100d0 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
100e0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
100f0 65 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20  e.  return (.   
10100 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
10110 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
10120 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
10130 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
10140 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
10150 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
10160 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
10170 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 23 65  UUM_INCR.  );.#e
10180 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
10190 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
101a0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
101b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
101c0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
101d0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
101e0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
101f0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
10200 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
10210 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
10220 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
10230 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
10240 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
10250 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
10260 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
10270 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
10280 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
10290 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
102a0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
102b0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
102c0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
102d0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
102e0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
102f0 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
10300 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 70  Bt){.  int rc, p
10310 61 67 65 53 69 7a 65 3b 0a 20 20 4d 65 6d 50 61  ageSize;.  MemPa
10320 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 66  ge *pPage1;.  if
10330 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20  ( pBt->pPage1 ) 
10340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10350 3b 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67 65  ;.  rc = getPage
10360 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
10370 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
10380 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
10390 72 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20  rn rc;.  ..  /* 
103a0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
103b0 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
103c0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
103d0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
103e0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
103f0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
10400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
10410 41 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ADB;.  if( sqlit
10420 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
10430 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20  (pBt->pPager)>0 
10440 29 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  ){.    u8 *page1
10450 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
10460 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
10470 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
10480 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
10490 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
104a0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
104b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
104c0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
104d0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
104e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
104f0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
10500 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
10510 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10520 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
10530 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61  e = get2byte(&pa
10540 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  ge1[16]);.    if
10550 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
10560 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20  pageSize)!=0 || 
10570 70 61 67 65 53 69 7a 65 3c 35 31 32 20 29 7b 0a  pageSize<512 ){.
10580 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
10590 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
105a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
105b0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
105c0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  0 );.    pBt->pa
105d0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
105e0 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
105f0 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
10600 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
10610 20 20 20 69 66 28 20 70 42 74 2d 3e 75 73 61 62     if( pBt->usab
10620 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
10630 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
10640 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
10650 7d 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  }.    pBt->maxEm
10660 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
10670 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  21];.    pBt->mi
10680 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  nEmbedFrac = pag
10690 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[22];.    pBt-
106a0 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70  >minLeafFrac = p
106b0 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65  age1[23];.#ifnde
106c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
106d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
106e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
106f0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
10700 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
10710 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
10720 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
10730 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
10740 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
10750 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
10760 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
10770 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
10780 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
10790 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
107a0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
107b0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
107c0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
107d0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
107e0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
107f0 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
10800 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
10810 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
10820 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
10830 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
10840 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10850 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
10860 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
10870 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
10880 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
10890 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
108a0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
108b0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
108c0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
108d0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
108e0 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
108f0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
10900 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
10910 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
10920 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
10930 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
10940 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
10950 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
10960 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
10970 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
10980 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
10990 2a 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72  *pBt->maxEmbedFr
109a0 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  ac/255 - 23;.  p
109b0 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
109c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
109d0 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  12)*pBt->minEmbe
109e0 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  dFrac/255 - 23;.
109f0 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
10a00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
10a10 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
10a20 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
10a30 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74  ableSize-12)*pBt
10a40 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 2f 32 35  ->minLeafFrac/25
10a50 35 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42  5 - 23;.  if( pB
10a60 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d  t->minLocal>pBt-
10a70 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74  >maxLocal || pBt
10a80 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a  ->maxLocal<0 ){.
10a90 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
10aa0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  nit_failed;.  }.
10ab0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
10ac0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
10ad0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
10ae0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
10af0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
10b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b10 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
10b20 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
10b30 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
10b40 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10b50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10b60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10b70 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b   works like lock
10b80 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74  Btree() except t
10b90 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f  hat it also invo
10ba0 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20  kes the.** busy 
10bb0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72  callback if ther
10bc0 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e is lock conten
10bd0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10be0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  int lockBtreeWit
10bf0 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52  hRetry(Btree *pR
10c00 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ef){.  int rc = 
10c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
10c20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
10c30 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
10c40 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
10c50 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
10c60 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
10c70 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
10c80 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
10c90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
10ca0 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
10cb0 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
10cc0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
10cd0 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
10ce0 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
10cf0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
10d00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10d20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
10d30 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
10d40 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
10d50 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
10d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
10d70 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
10d80 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
10d90 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
10da0 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
10db0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
10dc0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10dd0 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
10de0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
10df0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
10e00 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
10e10 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
10e20 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
10e30 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
10e40 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
10e50 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
10e60 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
10e70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10e80 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
10e90 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
10ea0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
10eb0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
10ec0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
10ed0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
10ee0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10ef0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10f00 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
10f10 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
10f20 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10f30 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
10f40 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
10f50 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72  ONE && pBt->pCur
10f60 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70  sor==0 && pBt->p
10f70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
10f80 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
10f90 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
10fa0 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20  ager)>=1 ){.    
10fb0 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
10fc0 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
10fd0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
10fe0 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
10ff0 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
11000 67 65 2d 3e 61 44 61 74 61 20 3d 20 26 28 28 75  ge->aData = &((u
11010 38 2a 29 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e  8*)pPage)[-pBt->
11020 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 20  pageSize];.     
11030 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
11040 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61  pBt;.        pPa
11050 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ge->pgno = 1;.  
11060 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
11070 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
11080 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
11090 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
110a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
110b0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
110c0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
110d0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
110e0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
110f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
11100 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
11110 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
11120 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
11130 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
11140 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
11150 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
11160 63 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  c;.  if( sqlite3
11170 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
11180 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20  Bt->pPager)>0 ) 
11190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
111a0 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  ;.  pP1 = pBt->p
111b0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
111c0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
111d0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
111e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
111f0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
11200 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
11210 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11220 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
11230 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
11240 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
11250 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
11260 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
11270 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
11280 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
11290 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
112a0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
112b0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
112c0 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
112d0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
112e0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
112f0 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61  ta[21] = pBt->ma
11300 78 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61  xEmbedFrac;.  da
11310 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69  ta[22] = pBt->mi
11320 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61  nEmbedFrac;.  da
11330 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69  ta[23] = pBt->mi
11340 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d  nLeafFrac;.  mem
11350 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
11360 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
11370 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
11380 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
11390 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
113a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
113b0 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
113c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
113d0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
113e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
113f0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
11400 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
11410 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
11420 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
11430 75 74 6f 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  utoVacuum);.#end
11440 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
11450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11460 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
11470 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
11480 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
11490 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
114a0 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
114b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
114c0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
114d0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
114e0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
114f0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11500 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
11510 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
11520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11530 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
11540 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
11550 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
11560 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
11570 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
11580 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
11590 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
115a0 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
115b0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
115c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
115d0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
115e0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
115f0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
11600 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
11610 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
11620 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
11630 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
11640 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
11650 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
11660 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
11670 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
11680 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11690 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
116a0 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
116b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
116c0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
116d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
116e0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
116f0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
11700 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
11710 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
11720 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
11730 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11740 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
11750 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
11760 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
11770 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
11780 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
11790 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
117a0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
117b0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
117c0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
117d0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
117e0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
117f0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
11800 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
11810 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
11820 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
11830 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
11840 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
11850 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
11860 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
11870 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
11880 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
11890 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
118a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
118b0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
118c0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
118d0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
118e0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
118f0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
11900 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
11910 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
11920 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
11930 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
11940 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
11950 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
11960 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
11970 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
11980 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
11990 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
119a0 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
119b0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
119c0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
119d0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
119e0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
119f0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
11a00 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
11a10 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
11a20 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
11a30 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
11a40 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
11a50 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
11a60 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
11a70 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
11a80 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
11a90 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
11aa0 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
11ab0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
11ac0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
11ad0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
11ae0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
11af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11b00 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
11b10 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
11b20 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
11b30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11b40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11b50 4f 4b 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  OK;..  btreeInte
11b60 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
11b70 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
11b80 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
11b90 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
11ba0 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
11bb0 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
11bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
11bd0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11be0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
11bf0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
11c00 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
11c10 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11c20 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
11c30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11c40 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
11c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11c60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
11c70 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
11c80 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
11c90 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
11ca0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
11cb0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
11cc0 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
11cd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11ce0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11cf0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f    }..  /* If ano
11d00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
11d10 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
11d20 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
11d30 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
11d40 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
11d50 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
11d60 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
11d70 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
11d80 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
11d90 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
11da0 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  _BUSY..  */.  if
11db0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
11dc0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
11dd0 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  E && wrflag ){. 
11de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11df0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 64 6f  _BUSY;.  }..  do
11e00 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   {.    if( pBt->
11e10 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
11e20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
11e30 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  e(pBt);.    }.. 
11e40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11e50 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
11e60 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
11e70 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
11e80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11e90 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
11ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11eb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11ec0 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
11ed0 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
11ee0 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
11ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11f00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
11f10 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
11f20 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
11f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11f40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11f60 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
11f70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
11f80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
11f90 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
11fa0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
11fb0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11fc0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
11fd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11fe0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
11ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
12000 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
12010 28 70 42 74 2d 3e 70 42 75 73 79 48 61 6e 64 6c  (pBt->pBusyHandl
12020 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  er) );..  if( rc
12030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12040 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
12050 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
12060 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
12070 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
12080 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
12090 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
120a0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
120b0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
120c0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
120d0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
120e0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
120f0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
12100 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ns;.    }.  }.. 
12110 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12120 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12130 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
12140 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12150 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
12160 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
12170 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
12180 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
12190 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
121a0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
121b0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
121c0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
121d0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
121e0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
121f0 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
12200 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
12210 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
12220 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
12230 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
12240 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
12270 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
12280 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
122b0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
122c0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
122d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
12300 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12310 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
12320 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
12330 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
12340 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
12350 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 69 6e 69  ge->pgno;..  ini
12360 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b  tPage(pPage, 0);
12370 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
12380 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
12390 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
123a0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
123b0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
123c0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20  ge, i);..    rc 
123d0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
123e0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
123f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12410 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
12420 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
12430 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
12440 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
12450 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
12460 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
12470 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  l);.      rc = p
12480 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
12490 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
124a0 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20  BTREE, pgno);.  
124b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
124c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74  TE_OK ) goto set
124d0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
124e0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
124f0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
12500 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
12510 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
12520 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
12530 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
12540 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  t+8]);.    rc = 
12550 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
12560 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
12570 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
12580 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
12590 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
125a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
125b0 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
125c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
125d0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
125e0 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72  e, which is guar
125f0 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 62  enteed to be a b
12600 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61  tree page, not a
12610 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  n overflow.** pa
12620 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ge, is a pointer
12630 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
12640 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
12650 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
12660 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e  oints to.** iTo.
12670 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
12680 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
12690 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
126a0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  o be modified, a
126b0 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  s .** follows:.*
126c0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
126d0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
126e0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
126f0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
12700 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
12730 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
12740 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
12750 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
12760 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
12770 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
12780 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
12790 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
127a0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
127b0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
127c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
127d0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
127e0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
127f0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
12800 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
12810 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
12820 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
12830 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
12840 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
12850 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
12860 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
12870 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
12880 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
12890 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65 54  eType){.  if( eT
128a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
128b0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
128c0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
128d0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
128e0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
128f0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
12900 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
12910 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
12920 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
12930 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12940 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12950 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
12960 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
12970 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
12980 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
12990 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
129a0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
129b0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
129c0 20 20 20 20 69 6e 69 74 50 61 67 65 28 70 50 61      initPage(pPa
129d0 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
129e0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
129f0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
12a00 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12a10 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
12a20 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
12a30 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
12a40 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
12a50 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
12a60 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12a70 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 43 65  .        parseCe
12a80 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
12a90 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
12aa0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
12ab0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
12ac0 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
12ad0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
12ae0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
12af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
12b00 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
12b10 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
12b20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
12b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12b40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12b50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12b60 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
12b70 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
12b80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
12b90 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
12ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12bb0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12bd0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
12be0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
12bf0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
12c00 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
12c10 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
12c20 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
12c30 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
12c40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
12c50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12c60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
12c70 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
12c80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
12c90 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
12ca0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
12cb0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12cc0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
12cd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12ce0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12cf0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
12d00 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
12d10 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
12d20 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
12d30 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
12d40 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
12d50 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
12d60 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
12d70 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
12d80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12d90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
12da0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
12db0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
12dc0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
12dd0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
12de0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
12df0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12e00 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
12e10 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
12e20 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
12e30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12e40 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
12e50 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
12e60 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
12e70 20 69 46 72 65 65 50 61 67 65 20 20 20 20 20 20   iFreePage      
12e80 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
12e90 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
12ea0 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  Page to */.){.  
12eb0 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
12ec0 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
12ed0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
12ee0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
12ef0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
12f00 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
12f10 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
12f20 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
12f30 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
12f40 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
12f50 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
12f60 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
12f70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
12f80 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
12f90 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
12fa0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
12fb0 54 50 41 47 45 20 29 3b 0a 0a 20 20 2f 2a 20 4d  TPAGE );..  /* M
12fc0 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
12fd0 20 66 72 6f 6d 20 69 74 27 73 20 63 75 72 72 65   from it's curre
12fe0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
12ff0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
13000 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
13010 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
13020 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
13030 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
13040 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
13050 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
13060 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
13070 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
13080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13090 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
130a0 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
130b0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29  Page, iFreePage)
130c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
130d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
130e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
130f0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
13100 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
13110 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
13120 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
13130 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
13140 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
13150 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
13160 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
13170 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
13180 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
13190 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
131a0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
131b0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
131c0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
131d0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
131e0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
131f0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
13200 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
13210 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
13220 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
13230 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
13240 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
13250 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
13260 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
13270 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
13280 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
13290 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
132a0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
132b0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
132c0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
132d0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
132e0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
132f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
13300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13310 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13320 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
13330 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
13340 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
13350 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
13360 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
13370 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
13380 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
13390 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
133a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
133b0 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
133c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
133d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
133e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
133f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13400 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
13410 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
13420 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
13430 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
13440 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
13450 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
13460 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
13470 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
13480 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
13490 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
134a0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
134b0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
134c0 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28     rc = getPage(
134d0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
134e0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
134f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13500 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
13510 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13530 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
13540 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
13550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13570 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
13580 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13590 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
135a0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
135b0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
135c0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
135d0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
135e0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
135f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13610 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
13620 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
13630 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
13640 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
13650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13660 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
13670 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
13680 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
13690 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
136a0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
136b0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
136c0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
136d0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
136e0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
136f0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
13700 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
13710 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
13720 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
13730 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
13740 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
13750 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
13760 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
13770 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
13780 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
13790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
137a0 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
137b0 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
137c0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
137d0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
137e0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
137f0 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
13800 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
13810 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
13820 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
13830 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
13840 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
13850 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
13860 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65  -zero, the imple
13870 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
13880 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
13890 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
138a0 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
138b0 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
138c0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
138d0 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
138e0 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
138f0 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
13900 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
13910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
13920 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
13930 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
13940 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  ss is complete..
13950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
13960 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
13970 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
13980 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69   nFin){.  Pgno i
13990 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20 20 20  LastPg;         
139a0 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65      /* Last page
139b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
139c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65   */.  Pgno nFree
139d0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
139e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
139f0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
13a00 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
13a10 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e  iLastPg = pBt->n
13a20 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61  Trunc;.  if( iLa
13a30 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  stPg==0 ){.    i
13a40 4c 61 73 74 50 67 20 3d 20 73 71 6c 69 74 65 33  LastPg = sqlite3
13a50 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13a60 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
13a70 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
13a80 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
13a90 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
13aa0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
13ab0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69  GE(pBt) ){.    i
13ac0 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54  nt rc;.    u8 eT
13ad0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
13ae0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
13af0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
13b00 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
13b10 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
13b20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
13b30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50   || nFin==iLastP
13b40 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
13b50 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
13b60 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
13b70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
13b80 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
13b90 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
13ba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13bb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13bc0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
13bd0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13be0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
13bf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13c00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13c10 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
13c20 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
13c30 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
13c40 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13c50 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
13c60 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
13c70 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
13c80 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
13c90 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
13ca0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
13cb0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63  -zero. In this c
13cc0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
13cd0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
13ce0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
13cf0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
13d00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13d10 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
13d20 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
13d30 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
13d40 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
13d50 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
13d60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13d70 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
13d80 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
13d90 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
13da0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
13db0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
13dc0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
13dd0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
13de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13e10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13e20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
13e30 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
13e40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13e50 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
13e60 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
13e70 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
13e80 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
13e90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13ea0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
13eb0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
13ec0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
13ed0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
13ee0 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
13ef0 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
13f00 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
13f10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13f20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
13f30 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
13f40 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20       /* If nFin 
13f50 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
13f60 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
13f70 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
13f80 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
13f90 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
13fa0 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
13fb0 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
13fc0 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
13fd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
13fe0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
13ff0 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65  , if nFin is gre
14000 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
14010 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
14020 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
14030 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
14040 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
14050 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
14060 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
14070 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
14080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
14090 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
140a0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
140b0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
140c0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
140d0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
140e0 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eePg, 0, 0);.   
140f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14110 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14120 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
14130 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14150 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
14160 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
14170 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20  ile( nFin!=0 && 
14180 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
14190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
141a0 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
141b0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
141c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
141d0 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44  rite(pLastPg->pD
141e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
141f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14200 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
14210 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20  n rc;.      } . 
14220 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
14230 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
14240 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
14250 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a  Page, iFreePg);.
14260 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14270 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
14280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
142a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
142b0 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  } .    }.  }..  
142c0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c  pBt->nTrunc = iL
142d0 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69  astPg - 1;.  whi
142e0 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  le( pBt->nTrunc=
142f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
14300 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
14310 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
14320 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20  >nTrunc) ){.    
14330 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20  pBt->nTrunc--;. 
14340 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14350 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14360 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
14370 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
14380 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
14390 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
143a0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
143b0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
143c0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
143d0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
143e0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
143f0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
14400 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
14410 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
14420 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
14430 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
14440 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
14450 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
14460 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
14470 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  cured,.** SQLITE
14480 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
14490 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
144a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
144b0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
144c0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
144d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
144e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
144f0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
14500 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14510 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
14520 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
14530 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
14540 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
14550 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uum ){.    retur
14560 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
14570 20 7d 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41   }.  invalidateA
14580 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
14590 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  pBt);.  return i
145a0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
145b0 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, 0);.}../*.** 
145c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
145d0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
145e0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
145f0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
14600 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
14610 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
14620 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
14630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
14640 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14650 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
14660 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
14670 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
14680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14690 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
146a0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
146b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
146c0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
146d0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
146e0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
146f0 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
14700 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
14710 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
14720 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
14730 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
14740 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
14750 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63  t, Pgno *pnTrunc
14760 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
14780 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
14790 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20  pPager;.#ifndef 
147a0 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65  NDEBUG.  int nRe
147b0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
147c0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
147d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 76 61  ;.#endif..  inva
147e0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
147f0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
14800 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
14810 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
14820 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
14830 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  {.    Pgno nFin 
14840 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42  = 0;..    if( pB
14850 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a  t->nTrunc==0 ){.
14860 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65        Pgno nFree
14870 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74  ;.      Pgno nPt
14880 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73  rmap;.      cons
14890 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
148a0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
148b0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73    Pgno nOrig = s
148c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
148d0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
148e0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54  );..      if( PT
148f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
14900 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20   nOrig) ){.     
14910 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14920 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14940 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
14950 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14960 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d  {.        nOrig-
14970 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
14980 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
14990 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
149a0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
149b0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
149c0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
149d0 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
149e0 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a  g)+pgsz/5)/(pgsz
149f0 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20  /5);.      nFin 
14a00 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
14a10 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20  - nPtrmap;.     
14a20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
14a30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
14a40 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49  ) && nFin<=PENDI
14a50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
14a60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69  ) ){.        nFi
14a70 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
14a80 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
14a90 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
14aa0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
14ab0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
14ac0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46  t) ){.        nF
14ad0 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  in--;.      }.  
14ae0 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
14af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14b00 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
14b10 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
14b20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nFin);.    }.   
14b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14b40 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73  DONE ){.      as
14b50 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20  sert(nFin==0 || 
14b60 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c  pBt->nTrunc==0 |
14b70 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72  | nFin<=pBt->nTr
14b80 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  unc);.      rc =
14b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14ba0 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
14bb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
14bc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
14bd0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
14be0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
14bf0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
14c00 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
14c10 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  0);.        put4
14c20 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
14c30 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
14c40 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
14c50 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20  Trunc = nFin;.  
14c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14c70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14c80 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
14c90 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
14ca0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
14cb0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
14cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
14cd0 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e  pnTrunc = pBt->n
14ce0 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e  Trunc;.    pBt->
14cf0 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  nTrunc = 0;.  }.
14d00 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
14d10 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
14d20 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
14d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14d40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
14d50 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
14d60 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
14d70 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
14d80 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
14d90 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
14da0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
14db0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
14dc0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
14dd0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
14de0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
14df0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
14e00 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
14e10 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
14e20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
14e30 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
14e40 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
14e50 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
14e60 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
14e70 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
14e80 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
14e90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
14ea0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
14eb0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
14ec0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
14ed0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
14ee0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
14ef0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
14f00 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
14f10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
14f20 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
14f30 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
14f40 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
14f50 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
14f60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
14f70 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
14f80 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
14f90 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
14fa0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
14fb0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
14fc0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
14fd0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
14fe0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
14ff0 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
15000 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
15010 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
15020 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
15030 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
15040 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
15050 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
15060 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
15070 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
15080 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
15090 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
150a0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
150b0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
150c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
150d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
150e0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
150f0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
15100 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
15110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
15120 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
15130 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
15140 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
15150 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
15160 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
15170 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
15180 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
15190 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
151a0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
151b0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
151c0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
151d0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
151e0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
151f0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
15200 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
15210 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
15220 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
15230 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
15240 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
15250 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
15260 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
15270 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
15280 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
15290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
152a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
152b0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
152c0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
152d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
152f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
15300 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
15310 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15320 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72  Bt;.    Pgno nTr
15330 75 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  unc = 0;.#ifndef
15340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15350 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
15360 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
15370 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
15380 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
15390 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20  Bt, &nTrunc); . 
153a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
153b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
153c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
153d0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
153e0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
153f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
15400 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
15410 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  r, zMaster, nTru
15420 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nc);.  }.  retur
15430 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
15440 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
15450 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
15460 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
15470 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15480 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
15490 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
154a0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
154b0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
154c0 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74  BtreeSync() rout
154d0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
154e0 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
154f0 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a  uld be invoked.*
15500 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
15510 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
15520 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
15530 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65  eeSync() routine
15540 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20   did.** all the 
15550 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
15560 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
15570 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
15580 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
15590 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
155a0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
155b0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
155c0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
155d0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
155e0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
155f0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f   truncate the ro
15600 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a  llback journal.*
15610 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  * (which causes 
15620 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15630 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64  to commit) and d
15640 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
15650 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
15660 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
15670 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15680 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
15690 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
156a0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
156b0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
156c0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
156d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
156e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
156f0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
15700 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15710 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  t;..  btreeInteg
15720 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
15730 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
15740 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
15750 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
15760 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
15770 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
15780 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
15790 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
157a0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
157b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
157c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
157d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
157e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
157f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
15800 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
15810 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
15820 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
15830 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15840 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
15850 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
15860 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
15870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15890 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
158a0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
158b0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74  NS_READ;.    pBt
158c0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
158d0 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  }.  unlockAllTab
158e0 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  les(p);..  /* If
158f0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
15900 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
15910 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
15920 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e  crement the tran
15930 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
15940 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
15950 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
15960 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
15970 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a   reaches 0, set.
15980 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20    ** the shared 
15990 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
159a0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
159b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63  treeIfUnused() c
159c0 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77  all below.  ** w
159d0 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
159e0 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ager..  */.  if(
159f0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
15a00 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70  NS_NONE ){.    p
15a10 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
15a20 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
15a30 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
15a40 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
15a50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
15a60 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
15a70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
15a80 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65  he handles curre
15a90 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
15aa0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
15ab0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
15ac0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
15ad0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
15ae0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
15af0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
15b00 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ion..  */.  p->i
15b10 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
15b20 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ONE;.  unlockBtr
15b30 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
15b40 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
15b50 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ty(p);.  return 
15b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15b70 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
15b80 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
15b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15ba0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
15bb0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
15bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
15bd0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
15be0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
15bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
15c10 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
15c20 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  wo(p);.  }.  ret
15c30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
15c40 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
15c50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
15c60 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
15c70 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
15c80 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
15c90 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
15ca0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
15cb0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
15cc0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
15cd0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
15ce0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
15cf0 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
15d00 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
15d10 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
15d20 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
15d30 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
15d40 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
15d50 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
15d60 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
15d70 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 20   pCur->wrFlag ) 
15d80 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
15d90 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
15da0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
15db0 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
15dc0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
15dd0 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 64 65  )./*.** Print de
15de0 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61 74  bugging informat
15df0 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 63 75  ion about all cu
15e00 72 73 6f 72 73 20 74 6f 20 73 74 61 6e 64 61 72  rsors to standar
15e10 64 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 76 6f 69  d output..*/.voi
15e20 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
15e30 72 73 6f 72 4c 69 73 74 28 42 74 72 65 65 20 2a  rsorList(Btree *
15e40 70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  p){.  BtCursor *
15e50 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64  pCur;.  BtShared
15e60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15e70 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
15e80 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
15e90 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
15ea0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
15eb0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
15ec0 67 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  ge;.    char *zM
15ed0 6f 64 65 20 3d 20 70 43 75 72 2d 3e 77 72 46 6c  ode = pCur->wrFl
15ee0 61 67 20 3f 20 22 72 77 22 20 3a 20 22 72 6f 22  ag ? "rw" : "ro"
15ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
15f00 75 67 50 72 69 6e 74 66 28 22 43 55 52 53 4f 52  ugPrintf("CURSOR
15f10 20 25 70 20 72 6f 6f 74 65 64 20 61 74 20 25 34   %p rooted at %4
15f20 64 28 25 73 29 20 63 75 72 72 65 6e 74 6c 79 20  d(%s) currently 
15f30 61 74 20 25 64 2e 25 64 25 73 5c 6e 22 2c 0a 20  at %d.%d%s\n",. 
15f40 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
15f50 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 7a 4d 6f 64  ->pgnoRoot, zMod
15f60 65 2c 0a 20 20 20 20 20 20 20 70 50 61 67 65 20  e,.       pPage 
15f70 3f 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3a 20  ? pPage->pgno : 
15f80 30 2c 20 70 43 75 72 2d 3e 69 64 78 2c 0a 20 20  0, pCur->idx,.  
15f90 20 20 20 20 20 28 70 43 75 72 2d 3e 65 53 74 61       (pCur->eSta
15fa0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
15fb0 29 20 3f 20 22 22 20 3a 20 22 20 65 6f 66 22 0a  ) ? "" : " eof".
15fc0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e      );.  }.}.#en
15fd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  dif../*.** Rollb
15fe0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
15ff0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
16000 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
16010 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
16020 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
16030 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
16040 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
16050 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
16060 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
16070 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
16080 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
16090 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
160a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
160b0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
160c0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
160d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
160e0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
160f0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
16100 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
16110 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
16120 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
16130 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
16140 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
16150 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
16160 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16170 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
16180 3b 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  ;..  rc = saveAl
16190 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
161a0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
161b0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
161c0 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
161d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161e0 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
161f0 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
16200 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
16210 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65  c() error occure
16220 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
16230 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
16240 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
16250 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
16260 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
16270 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
16280 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
16290 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
162a0 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
162b0 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
162c0 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
162d0 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
162e0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
162f0 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
16300 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
16310 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
16320 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
16330 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
16340 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
16350 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
16360 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
16370 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
16380 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
16390 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
163a0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
163b0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pBt->pCursor ){
163c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
163d0 64 62 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  db = pBt->pCurso
163e0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 53 71 6c 69  r->pBtree->pSqli
163f0 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  te;.      if( db
16400 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16410 74 65 33 41 62 6f 72 74 4f 74 68 65 72 41 63 74  te3AbortOtherAct
16420 69 76 65 56 64 62 65 73 28 64 62 2c 20 30 29 3b  iveVdbes(db, 0);
16430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16440 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
16450 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
16460 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
16470 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
16480 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
16490 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
164a0 63 32 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  c2;..#ifndef SQL
164b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
164c0 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72  UUM.    pBt->nTr
164d0 75 6e 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unc = 0;.#endif.
164e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
164f0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
16500 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
16510 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
16520 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
16530 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
16540 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
16550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
16560 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
16570 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
16580 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
16590 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
165a0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
165b0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 67 65  o.    ** call ge
165c0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
165d0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 20  1 again to make 
165e0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
165f0 74 61 20 69 73 0a 20 20 20 20 2a 2a 20 73 65 74  ta is.    ** set
16600 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
16610 20 20 20 69 66 28 20 67 65 74 50 61 67 65 28 70     if( getPage(p
16620 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
16630 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
16640 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
16650 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
16660 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
16670 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
16680 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
16690 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
166a0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
166b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
166c0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
166d0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
166e0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
166f0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
16700 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
16710 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
16720 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
16730 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
16740 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
16750 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
16760 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  }..  p->inTrans 
16770 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
16780 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
16790 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
167a0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
167b0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
167c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
167d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
167e0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
167f0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20  ansaction.  The 
16800 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
16810 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  an.** can be rol
16820 6c 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  led back indepen
16830 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
16840 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  in transaction..
16850 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  ** You must star
16860 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
16870 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
16880 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
16890 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e  ..** The subtran
168a0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
168b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
168c0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
168d0 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74  action.** commit
168e0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
168f0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20  .**.** Only one 
16900 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  subtransaction m
16910 61 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20  ay be active at 
16920 61 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61  a time.  It is a
16930 6e 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a  n error to try.*
16940 2a 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  * to start a new
16950 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
16960 69 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72  if another subtr
16970 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
16980 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a  eady active..**.
16990 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
169a0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
169b0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
169c0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
169d0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
169e0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
169f0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
16a00 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
16a10 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
16a20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
16a30 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
16a40 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
16a50 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
16a60 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
16a70 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
16a80 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
16a90 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
16aa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
16ab0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ac0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
16ad0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16ae0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16af0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 28   p->pBt;.  if( (
16b00 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
16b10 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
16b20 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
16b30 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
16b40 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
16b50 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
16b60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65  RROR;.  }.  asse
16b70 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
16b80 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
16b90 49 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 70 42  ITE );.  rc = pB
16ba0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
16bb0 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
16bc0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
16bd0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
16be0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
16bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16c00 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
16c10 68 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74  he statment subt
16c20 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
16c30 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
16c40 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74  .  If no.** subt
16c50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
16c60 74 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20  tive, this is a 
16c70 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
16c80 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
16c90 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
16ca0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
16cb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16cc0 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  Bt;.  if( pBt->i
16cd0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
16ce0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
16cf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16d00 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
16d10 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
16d20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16d30 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
16d40 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 72  >inStmt = 0;.  r
16d50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16d60 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
16d70 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
16d80 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
16d90 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
16da0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
16db0 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
16dc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
16dd0 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
16de0 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
16df0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
16e00 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
16e10 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
16e20 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
16e30 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
16e40 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
16e50 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
16e60 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
16e70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
16e80 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
16e90 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
16ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16eb0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
16ec0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16ed0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73  sqlite3MallocDis
16ee0 61 6c 6c 6f 77 28 29 3b 0a 20 20 69 66 28 20 70  allow();.  if( p
16ef0 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
16f00 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
16f10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16f20 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
16f30 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
16f40 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
16f50 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
16f60 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
16f70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
16f80 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  }.  sqlite3Mallo
16f90 63 41 6c 6c 6f 77 28 29 3b 0a 20 20 72 65 74 75  cAllow();.  retu
16fa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16fb0 44 65 66 61 75 6c 74 20 6b 65 79 20 63 6f 6d 70  Default key comp
16fc0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
16fd0 74 6f 20 62 65 20 75 73 65 64 20 69 66 20 6e 6f  to be used if no
16fe0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
16ff0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 70 65 63 69  tion.** is speci
17000 66 69 65 64 20 6f 6e 20 74 68 65 20 73 71 6c 69  fied on the sqli
17010 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 29  te3BtreeCursor()
17020 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
17030 20 69 6e 74 20 64 66 6c 74 43 6f 6d 70 61 72 65   int dfltCompare
17040 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
17050 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
17060 2a 20 55 73 65 72 20 64 61 74 61 20 69 73 20 6e  * User data is n
17070 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  ot used */.  int
17080 20 6e 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   n1, const void 
17090 2a 70 31 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  *p1,    /* First
170a0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
170b0 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 63 6f 6e  */.  int n2, con
170c0 73 74 20 76 6f 69 64 20 2a 70 32 20 20 20 20 20  st void *p2     
170d0 2f 2a 20 53 65 63 6f 6e 64 20 6b 65 79 20 74 6f  /* Second key to
170e0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 29 7b 0a 20   compare */.){. 
170f0 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 6d 65   int c;.  c = me
17100 6d 63 6d 70 28 70 31 2c 20 70 32 2c 20 6e 31 3c  mcmp(p1, p2, n1<
17110 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20  n2 ? n1 : n2);. 
17120 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
17130 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20   c = n1 - n2;.  
17140 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  }.  return c;.}.
17150 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
17160 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
17170 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
17180 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
17190 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
171a0 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
171b0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
171c0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
171d0 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
171e0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
171f0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
17200 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
17210 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
17220 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
17230 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
17240 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
17250 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
17260 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
17270 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
17280 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
17290 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
172a0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
172b0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
172c0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
172d0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
172e0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
172f0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
17300 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
17310 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
17320 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
17330 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
17340 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
17350 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
17360 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
17370 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
17380 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
17390 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
173a0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
173b0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
173c0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
173d0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
173e0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
173f0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
17400 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
17410 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
17420 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
17430 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
17440 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
17450 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
17460 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
17470 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
17480 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
17490 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
174a0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
174b0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
174c0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
174d0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
174e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
174f0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
17500 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
17510 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
17520 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
17530 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
17540 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
17550 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
17560 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
17570 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
17580 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
17590 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
175a0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
175b0 20 6c 6f 67 69 63 61 6c 6c 79 20 74 68 65 20 73   logically the s
175c0 61 6d 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ame for every cu
175d0 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61 20 70 61 72  rsor.** on a par
175e0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
175f0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 63 6f 6d  Changing the com
17600 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
17610 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
17620 69 6e 20 69 6e 63 6f 72 72 65 63 74 20 6f 70 65  in incorrect ope
17630 72 61 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  rations.  If the
17640 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
17650 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 61 0a  tion is NULL, a.
17660 2a 2a 20 64 65 66 61 75 6c 74 20 63 6f 6d 70 61  ** default compa
17670 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
17680 73 20 75 73 65 64 2e 20 20 54 68 65 20 63 6f 6d  s used.  The com
17690 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
176a0 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 69 67   is.** always ig
176b0 6e 6f 72 65 64 20 66 6f 72 20 49 4e 54 4b 45 59  nored for INTKEY
176c0 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20   tables..*/.int 
176d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
176e0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
17720 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17760 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
17770 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
177a0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
177b0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69  read-only */.  i
177c0 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
177d0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
177e0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
177f0 29 2c 20 2f 2a 20 4b 65 79 20 43 6f 6d 70 61 72  ), /* Key Compar
17800 69 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76  ison func */.  v
17810 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
17840 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
17850 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
17860 73 6f 72 20 2a 2a 70 70 43 75 72 20 20 20 20 20  sor **ppCur     
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
17890 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
178a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
178b0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
178c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
178d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2a  t = p->pBt;..  *
178e0 70 70 43 75 72 20 3d 20 30 3b 0a 20 20 69 66 28  ppCur = 0;.  if(
178f0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69   wrFlag ){.    i
17900 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
17910 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17920 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17940 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
17950 2c 20 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a  , iTable, 0) ){.
17960 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17970 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
17980 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
17990 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
179a0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
179b0 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
179c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
179d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
179e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
179f0 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
17a00 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
17a10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
17a20 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
17a30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
17a40 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
17a50 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29   sizeof(*pCur) )
17a60 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20  ;.  if( pCur==0 
17a70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
17a80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
17a90 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
17aa0 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
17ab0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
17ac0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
17ad0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
17ae0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
17af0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
17b00 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
17b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
17b20 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  TY;.    goto cre
17b30 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
17b40 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tion;.  }.  rc =
17b50 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
17b60 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
17b70 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
17b80 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
17b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17ba0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
17bb0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
17bc0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
17bd0 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
17be0 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
17bf0 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
17c00 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
17c10 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e  * variables, lin
17c20 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
17c30 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
17c40 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43  ist and set *ppC
17c50 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74  ur (the.  ** out
17c60 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  put argument to 
17c70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  this function)..
17c80 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 78 43 6f    */.  pCur->xCo
17c90 6d 70 61 72 65 20 3d 20 78 43 6d 70 20 3f 20 78  mpare = xCmp ? x
17ca0 43 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72  Cmp : dfltCompar
17cb0 65 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72 67 20  e;.  pCur->pArg 
17cc0 3d 20 70 41 72 67 3b 0a 20 20 70 43 75 72 2d 3e  = pArg;.  pCur->
17cd0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
17ce0 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
17cf0 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
17d00 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
17d10 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
17d20 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
17d30 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
17d40 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
17d50 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
17d60 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
17d70 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
17d80 44 3b 0a 20 20 2a 70 70 43 75 72 20 3d 20 70 43  D;.  *ppCur = pC
17d90 75 72 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ur;..  return SQ
17da0 4c 49 54 45 5f 4f 4b 3b 0a 63 72 65 61 74 65 5f  LITE_OK;.create_
17db0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
17dc0 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
17dd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17de0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
17df0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
17e00 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b  r);.  }.  unlock
17e10 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
17e20 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
17e30 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f  .}..#if 0  /* No
17e40 74 20 55 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  t Used */./*.** 
17e50 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
17e60 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
17e70 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64  on function used
17e80 20 62 79 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f   by a cursor..*/
17e90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
17ea0 65 65 53 65 74 43 6f 6d 70 61 72 65 28 0a 20 20  eeSetCompare(.  
17eb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
17ec0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
17ed0 72 20 74 6f 20 77 68 6f 73 65 20 63 6f 6d 70 61  r to whose compa
17ee0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
17ef0 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69  s changed */.  i
17f00 6e 74 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c  nt(*xCmp)(void*,
17f10 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
17f20 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
17f30 2c 20 2f 2a 20 4e 65 77 20 63 6f 6d 70 61 72 69  , /* New compari
17f40 73 6f 6e 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f  son func */.  vo
17f50 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
17f60 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
17f70 65 6e 74 20 74 6f 20 78 43 6d 70 28 29 20 2a 2f  ent to xCmp() */
17f80 0a 29 7b 0a 20 20 70 43 75 72 2d 3e 78 43 6f 6d  .){.  pCur->xCom
17f90 70 61 72 65 20 3d 20 78 43 6d 70 20 3f 20 78 43  pare = xCmp ? xC
17fa0 6d 70 20 3a 20 64 66 6c 74 43 6f 6d 70 61 72 65  mp : dfltCompare
17fb0 3b 0a 20 20 70 43 75 72 2d 3e 70 41 72 67 20 3d  ;.  pCur->pArg =
17fc0 20 70 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a   pArg;.}.#endif.
17fd0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
17fe0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
17ff0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
18000 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
18010 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
18020 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
18030 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
18040 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
18050 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
18060 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 53 68  r *pCur){.  BtSh
18070 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
18080 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  ->pBtree->pBt;. 
18090 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
180a0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
180b0 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
180c0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76  .    pCur->pPrev
180d0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
180e0 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
180f0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
18100 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
18110 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
18120 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
18130 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
18140 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
18150 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
18160 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
18170 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
18180 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 6e 76  used(pBt);.  inv
18190 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
181a0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 73 71  ache(pCur);.  sq
181b0 6c 69 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a  liteFree(pCur);.
181c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
181d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
181e0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
181f0 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20  rsor by filling 
18200 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  in the fields of
18210 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68   pTempCur..** Th
18220 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  e temporary curs
18230 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  or is not on the
18240 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72   cursor list for
18250 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 73   the Btree..*/.s
18260 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 54 65  tatic void getTe
18270 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
18280 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
18290 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
182a0 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
182b0 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70   pCur, sizeof(*p
182c0 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  Cur));.  pTempCu
182d0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
182e0 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
182f0 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70  = 0;.  if( pTemp
18300 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
18310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
18320 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  f(pTempCur->pPag
18330 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
18340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
18350 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
18360 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
18370 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
18380 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
18390 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
183a0 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
183b0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 54 65 6d   void releaseTem
183c0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
183d0 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
183e0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
183f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18400 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
18410 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
18420 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
18430 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  e the BtCursor.i
18440 6e 66 6f 20 66 69 65 6c 64 20 6f 66 20 74 68 65  nfo field of the
18450 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73   given cursor is
18460 20 76 61 6c 69 64 2e 0a 2a 2a 20 49 66 20 69 74   valid..** If it
18470 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18480 76 61 6c 69 64 2c 20 63 61 6c 6c 20 70 61 72 73  valid, call pars
18490 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
184a0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
184b0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
184c0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
184d0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
184e0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
184f0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
18500 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
18510 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
18520 20 70 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f   parseCell()..*/
18530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
18540 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
18550 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
18560 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
18570 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 72 73 65  ==0 ){.    parse
18580 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
18590 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
185a0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
185b0 73 65 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  se{.#ifndef NDEB
185c0 55 47 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  UG.    CellInfo 
185d0 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
185e0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
185f0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 70 61  f(info));.    pa
18600 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
18610 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
18620 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
18630 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
18640 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
18650 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
18660 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
18670 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
18680 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
18690 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
186a0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
186b0 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
186c0 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
186d0 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
186e0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
186f0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
18700 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
18710 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
18720 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
18730 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
18740 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
18750 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
18760 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
18770 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
18780 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
18790 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
187a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
187b0 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
187c0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
187d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65  ){.  int rc = re
187e0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
187f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
18800 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18820 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18830 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
18840 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
18850 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18860 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
18870 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18880 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
18890 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
188a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
188b0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
188c0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
188d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
188e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
188f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18900 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
18910 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18920 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
18930 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
18940 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
18950 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
18960 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
18970 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
18980 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
18990 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
189a0 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
189b0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
189c0 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
189d0 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
189e0 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
189f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
18a00 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
18a10 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
18a20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18a30 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
18a40 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
18a50 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
18a60 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
18a70 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
18a80 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
18a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18aa0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18ab0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
18ac0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
18ad0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18ae0 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
18af0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18b00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
18b10 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69        /* Not poi
18b20 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
18b30 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53   entry - set *pS
18b40 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20  ize to 0. */.   
18b50 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
18b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18b70 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
18b80 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  );.      *pSize 
18b90 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
18ba0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
18bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18bc0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
18bd0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
18be0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
18bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
18c00 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
18c10 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
18c20 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
18c30 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
18c40 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
18c50 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
18c60 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
18c70 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
18c80 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
18c90 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
18ca0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
18cb0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
18cc0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
18cd0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
18ce0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
18cf0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
18d00 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
18d10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
18d20 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e  erwise:.**.** Un
18d30 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69  less pPgnoNext i
18d40 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65  s NULL, the page
18d50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
18d60 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ext overflow .**
18d70 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
18d80 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74  ked list is writ
18d90 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
18da0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a  t. If page ovfl.
18db0 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  ** is the last p
18dc0 61 67 65 20 69 6e 20 69 74 27 73 20 6c 69 6e 6b  age in it's link
18dd0 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ed list, *pPgnoN
18de0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
18df0 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
18e00 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
18e10 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  , *ppPage is set
18e20 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a   to the MemPage*
18e30 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70   handle.** for p
18e40 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e  age ovfl. The un
18e50 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70  derlying pager p
18e60 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  age may have bee
18e70 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77  n requested.** w
18e80 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e  ith the noConten
18e90 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74  t flag set, so t
18ea0 68 65 20 70 61 67 65 20 64 61 74 61 20 61 63 63  he page data acc
18eb0 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74  essable via.** t
18ec0 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e  his handle may n
18ed0 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a  ot be trusted..*
18ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
18ef0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
18f00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
18f10 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f30 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
18f40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
18f50 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
18f60 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
18f70 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
18f80 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
18f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18fa0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
18fb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
18fc0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
18fd0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
18fe0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65   /* One of these
18ff0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c   must not be NUL
19000 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  L. Otherwise, wh
19010 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  y call this func
19020 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72  tion? */.  asser
19030 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e  t(ppPage || pPgn
19040 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66  oNext);..  /* If
19050 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55   pPgnoNext is NU
19060 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
19070 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
19080 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
19090 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a  .  ** a MemPage*
190a0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e   reference only.
190b0 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73   No page-data is
190c0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 69   required in thi
190d0 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  s case..  */.  i
190e0 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b  f( !pPgnoNext ){
190f0 0a 20 20 20 20 72 65 74 75 72 6e 20 67 65 74 50  .    return getP
19100 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70  age(pBt, ovfl, p
19110 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a  pPage, 1);.  }..
19120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19130 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
19140 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
19150 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
19160 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
19170 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
19180 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
19190 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
191a0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
191b0 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
191c0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
191d0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
191e0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
191f0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
19200 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
19210 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
19220 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
19230 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
19240 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
19250 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19260 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
19270 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
19280 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19290 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
192a0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
192b0 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
192c0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
192d0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
192e0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
192f0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
19300 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
19310 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
19320 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
19330 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74  f( iGuess<=sqlit
19340 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19350 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
19360 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
19370 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
19380 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
19390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
193a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
193b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
193c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
193d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
193e0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
193f0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
19400 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
19410 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
19420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
19430 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70  f( next==0 || pp
19440 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50  Page ){.    MemP
19450 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
19460 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67  .    rc = getPag
19470 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
19480 61 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20  age, next!=0);. 
19490 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51     assert(rc==SQ
194a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
194b0 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ==0);.    if( ne
194c0 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  xt==0 && rc==SQL
194d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
194e0 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
194f0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
19500 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70     }..    if( pp
19510 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  Page ){.      *p
19520 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
19530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19540 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19550 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
19560 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
19570 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t;..  return rc;
19580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
19590 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
195a0 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
195b0 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
195c0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
195d0 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
195e0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
195f0 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
19600 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
19610 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
19620 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
19630 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
19640 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
19650 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
19660 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
19670 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
19680 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
19690 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
196a0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
196b0 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
196c0 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
196d0 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
196e0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
196f0 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
19700 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
19710 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19720 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
19730 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
19740 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
19750 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
19760 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
19770 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
19780 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
19790 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
197a0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
197b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
197c0 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
197d0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197f0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19800 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
19810 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
19820 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
19830 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
19840 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
19850 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
19860 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
19870 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
19880 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
19890 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
198a0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
198b0 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
198c0 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
198d0 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
198e0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
198f0 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
19900 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
19910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19920 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19930 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
19940 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
19950 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
19960 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
19970 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
19980 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
19990 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
199a0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
199b0 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
199c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
199d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
199e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
199f0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
19a00 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
19a10 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
19a20 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
19a30 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
19a40 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
19a50 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a   to. If the eOp.
19a60 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
19a70 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61  0, this is a rea
19a80 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74  d operation (dat
19a90 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a  a copied into.**
19aa0 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49   buffer pBuf). I
19ab0 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
19ac0 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20  , a write (data 
19ad0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62  copied from.** b
19ae0 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a  uffer pBuf)..**.
19af0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
19b00 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
19b10 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
19b20 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
19b30 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
19b40 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
19b50 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
19b60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19b70 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ine does not mak
19b80 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20  e a distinction 
19b90 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20  between key and 
19ba0 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74  data..** It just
19bb0 20 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73   reads or writes
19bc0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
19bd0 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44  payload area.  D
19be0 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70  ata might .** ap
19bf0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
19c00 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74   page or be scat
19c10 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
19c20 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a  tiple overflow .
19c30 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** pages..**.** 
19c40 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
19c50 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
19c60 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e   flag is set, an
19c70 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  d the current.**
19c80 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
19c90 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
19ca0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
19cb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
19cc0 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20  allocates space 
19cd0 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
19ce0 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
19cf0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
19d00 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20  .** cache array 
19d10 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
19d20 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74  low). Subsequent
19d30 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a   calls use this.
19d40 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  ** cache to make
19d50 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
19d60 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
19d70 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
19d80 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
19d90 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
19da0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
19db0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61  allocated, it ma
19dc0 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  y be.** invalida
19dd0 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
19de0 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20  r cursor writes 
19df0 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  to the same tabl
19e00 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20  e, or if.** the 
19e10 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
19e20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  to a different r
19e30 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ow. Additionally
19e40 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  , in auto-vacuum
19e50 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f  .** mode, the fo
19e60 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d  llowing events m
19e70 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  ay invalidate an
19e80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
19e90 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  ist cache..**.**
19ea0 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e     * An incremen
19eb0 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20  tal vacuum,.**  
19ec0 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61   * A commit in a
19ed0 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c  uto_vacuum="full
19ee0 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43  " mode,.**   * C
19ef0 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  reating a table 
19f00 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76  (may require mov
19f10 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ing an overflow 
19f20 70 61 67 65 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  page)..*/.#defin
19f30 65 20 67 65 74 50 61 79 6c 6f 61 64 28 61 2c 62  e getPayload(a,b
19f40 2c 63 2c 64 2c 65 29 20 61 63 63 65 73 73 50 61  ,c,d,e) accessPa
19f50 79 6c 6f 61 64 28 61 2c 62 2c 63 2c 64 2c 65 2c  yload(a,b,c,d,e,
19f60 30 29 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  0).static int ac
19f70 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
19f80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
19f90 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
19fa0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
19fb0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
19fc0 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20    int offset,   
19fd0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
19fe0 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
19ff0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
1a000 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
1a010 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
1a020 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1a030 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1a040 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
1a050 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
1a060 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
1a070 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c   .  int skipKey,
1a080 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73           /* offs
1a090 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74  et begins at dat
1a0a0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1a0b0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20  e */.  int eOp  
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1a0d0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
1a0e0 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
1a0f0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1a100 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1a110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a120 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
1a130 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
1a140 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1a150 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1a160 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72  e;        /* Btr
1a170 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
1a180 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
1a190 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1a1a0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  Bt = pCur->pBtre
1a1b0 65 2d 3e 70 42 74 3b 20 20 20 2f 2a 20 42 74 72  e->pBt;   /* Btr
1a1c0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
1a1d0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
1a1e0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
1a1f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a200 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a210 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1a220 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a230 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a240 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1a250 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
1a260 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
1a270 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1a280 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1a290 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
1a2a0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1a2b0 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
1a2c0 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72  ntKey ? 0 : pCur
1a2d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
1a2e0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
1a2f0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
1a300 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
1a310 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
1a320 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1a330 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1a340 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1a350 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1a360 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1a370 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1a380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1a390 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  OR;.  }..  /* Ch
1a3a0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
1a3b0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
1a3c0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
1a3d0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
1a3e0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1a3f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1a400 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
1a410 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
1a420 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
1a430 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1a440 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
1a450 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
1a460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1a470 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1a480 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
1a490 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
1a4a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1a4b0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1a4c0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1a4d0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1a4e0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1a4f0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1a500 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1a510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a520 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1a530 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a  onst int ovflSiz
1a540 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1a550 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1a560 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1a570 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1a580 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1a590 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1a5a0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1a5b0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1a5c0 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1a5d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1a5e0 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1a5f0 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1a600 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1a610 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1a620 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1a630 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1a640 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1a650 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1a660 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1a670 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1a680 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1a690 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1a6a0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1a6b0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1a6c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1a6d0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1a6e0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1a6f0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1a700 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1a710 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1a720 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1a730 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1a740 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1a750 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1a760 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1a770 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1a780 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1a790 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1a7a0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1a7b0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1a7c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1a7d0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1a7e0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1a7f0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1a800 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1a810 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1a820 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50  eMalloc(sizeof(P
1a830 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1a840 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20     if( nOvfl && 
1a850 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1a860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a870 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a890 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
1a8a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1a8b0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1a8c0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
1a8d0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
1a8e0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
1a8f0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
1a900 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
1a910 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
1a920 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
1a930 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1a940 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
1a950 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
1a960 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
1a970 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
1a980 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
1a990 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1a9a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1a9b0 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
1a9c0 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
1a9d0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
1a9e0 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
1a9f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1aa00 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
1aa10 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
1aa20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa30 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1aa40 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
1aa50 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
1aa60 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1aa70 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
1aa80 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1aa90 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1aaa0 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
1aab0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
1aac0 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
1aad0 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
1aae0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
1aaf0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1ab00 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
1ab10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1ab20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
1ab30 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1ab40 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
1ab50 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
1ab60 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
1ab70 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
1ab80 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1ab90 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
1aba0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1abb0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
1abc0 67 65 0a 09 2a 2a 20 64 61 74 61 20 69 73 20 6e  ge..** data is n
1abd0 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
1abe0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
1abf0 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
1ac00 0a 09 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63  ..** page-list c
1ac10 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
1ac20 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
1ac30 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
1ac40 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
1ac50 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
1ac60 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1ac70 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1ac80 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
1ac90 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1aca0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1acb0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
1acc0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1acd0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1ace0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
1acf0 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
1ad00 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
1ad10 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1ad20 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
1ad30 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
1ad40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63         assert(rc
1ad50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  ==SQLITE_OK || n
1ad60 65 78 74 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20  extPage==0);.   
1ad70 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
1ad80 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
1ad90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1ada0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
1adb0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
1adc0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
1add0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
1ade0 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
1adf0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
1ae00 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
1ae10 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
1ae20 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
1ae30 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
1ae40 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
1ae50 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1ae60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ae70 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
1ae80 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
1ae90 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
1aea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aeb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aec0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
1aed0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1aee0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
1aef0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1af00 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
1af10 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
1af20 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
1af30 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1af40 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
1af50 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1af60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1af70 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
1af80 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1af90 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
1afa0 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
1afb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1afc0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1afd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1afe0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1aff0 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
1b000 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
1b010 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
1b020 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b030 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1b040 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1b050 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b060 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b070 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
1b080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b090 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1b0a0 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
1b0b0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1b0c0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1b0d0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1b0e0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1b0f0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1b100 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1b110 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1b120 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1b130 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1b140 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1b150 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1b160 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1b170 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1b180 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1b190 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1b1a0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1b1b0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1b1c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1b1d0 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
1b1e0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1b1f0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1b200 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  f){.  int rc = r
1b210 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
1b220 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1b230 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1b250 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b260 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b270 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b280 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
1b290 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1b2a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1b2b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b2c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b2d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
1b2e0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1b2f0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
1b300 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b310 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1b320 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
1b330 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
1b340 63 20 3d 20 67 65 74 50 61 79 6c 6f 61 64 28 70  c = getPayload(p
1b350 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1b360 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1b370 2a 29 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  *)pBuf, 0);.  }.
1b380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b390 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1b3a0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
1b3b0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
1b3c0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
1b3d0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
1b3e0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
1b3f0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
1b400 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
1b410 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
1b420 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
1b430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1b440 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
1b450 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
1b460 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1b470 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
1b480 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
1b490 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
1b4a0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
1b4b0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
1b4c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b4d0 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
1b4e0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
1b4f0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
1b500 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
1b510 6e 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  nt rc = restoreO
1b520 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1b530 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1b540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b550 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b560 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b570 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1b580 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1b590 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
1b5a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1b5b0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
1b5c0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
1b5d0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1b5e0 67 65 74 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  getPayload(pCur,
1b5f0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
1b600 75 66 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 1);.  }.  re
1b610 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b620 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1b630 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1b640 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1b650 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1b660 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1b670 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1b680 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1b690 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1b6a0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1b6b0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1b6c0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1b6d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1b6e0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1b6f0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1b700 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1b710 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1b720 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1b730 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1b740 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1b750 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1b760 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1b770 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1b780 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1b790 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1b7a0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1b7b0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1b7c0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1b7d0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1b7e0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1b7f0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1b800 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1b810 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1b820 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1b830 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1b840 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1b850 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1b860 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1b870 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1b880 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1b890 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1b8a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1b8b0 20 74 68 65 6e 20 67 65 74 50 61 79 6c 6f 61 64   then getPayload
1b8c0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
1b8d0 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a  to reassembly.**
1b8e0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
1b8f0 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
1b900 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
1b910 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
1b920 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1b930 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
1b940 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
1b950 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
1b960 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
1b970 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
1b980 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
1b990 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
1b9a0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
1b9b0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
1b9c0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1b9d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b9e0 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
1b9f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1ba00 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1ba10 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1ba20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1ba30 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
1ba40 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1ba50 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1ba60 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1ba70 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
1ba80 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
1ba90 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
1baa0 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
1bab0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1bac0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1bad0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1bae0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1baf0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
1bb00 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  t nLocal;..  ass
1bb10 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
1bb20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29  pCur->pPage!=0 )
1bb30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1bb40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bb50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67  _VALID );.  pPag
1bb60 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1bb70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1bb80 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1bb90 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1bba0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1bbb0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1bbc0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1bbd0 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1bbe0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1bbf0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1bc00 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1bc10 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1bc20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1bc30 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
1bc40 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
1bc50 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
1bc60 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
1bc70 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1bc80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1bc90 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
1bca0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
1bcb0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1bcc0 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e      if( nLocal>n
1bcd0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  Key ){.      nLo
1bce0 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  cal = nKey;.    
1bcf0 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  }.  }.  *pAmt = 
1bd00 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
1bd10 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
1bd20 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
1bd30 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1bd40 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
1bd50 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
1bd60 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
1bd70 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
1bd80 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
1bd90 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
1bda0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
1bdb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1bdc0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
1bdd0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
1bde0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1bdf0 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
1be00 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
1be10 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
1be20 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
1be30 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
1be40 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
1be50 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
1be60 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
1be70 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
1be80 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
1be90 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
1bea0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
1beb0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
1bec0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
1bed0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1bee0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
1bef0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1bf00 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1bf10 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1bf20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1bf30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
1bf40 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1bf50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1bf60 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1bf70 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
1bf80 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1bf90 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
1bfa0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1bfb0 70 41 6d 74 29 7b 0a 20 20 69 66 28 20 70 43 75  pAmt){.  if( pCu
1bfc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bfd0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1bfe0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1bff0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1c000 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
1c010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1c020 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1c030 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1c040 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
1c050 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
1c060 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1c070 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
1c080 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
1c090 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
1c0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1c0b0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
1c0c0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
1c0d0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
1c0e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
1c0f0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
1c100 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
1c110 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1c120 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a  ->pBtree->pBt;..
1c130 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c140 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1c150 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67  ALID );.  rc = g
1c160 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1c170 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
1c180 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61  wPage, pCur->pPa
1c190 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1c1a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65  return rc;.  pNe
1c1b0 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  wPage->idxParent
1c1c0 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
1c1d0 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d  pOldPage = pCur-
1c1e0 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61  >pPage;.  pOldPa
1c1f0 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
1c200 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1c210 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75  pOldPage);.  pCu
1c220 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50  r->pPage = pNewP
1c230 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  age;.  pCur->idx
1c240 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1c250 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1c260 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
1c270 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
1c280 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c290 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1c2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c2c0 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
1c2d0 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c  e is the virtual
1c2e0 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62   root of its tab
1c2f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69  le..**.** The vi
1c300 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
1c310 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
1c320 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73   for most tables
1c330 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68  .  But.** for th
1c340 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f  e table rooted o
1c350 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69  n page 1, someti
1c360 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  me the real root
1c370 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74   page.** is empt
1c380 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  y except for the
1c390 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20   right-pointer. 
1c3a0 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74   In such cases t
1c3b0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f  he.** virtual ro
1c3c0 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70  ot page is the p
1c3d0 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67  age that the rig
1c3e0 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61  ht-pointer of pa
1c3f0 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74  ge.** 1 is point
1c400 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ing to..*/.stati
1c410 63 20 69 6e 74 20 69 73 52 6f 6f 74 50 61 67 65  c int isRootPage
1c420 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1c430 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1c440 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
1c450 61 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61  arent;.  if( pPa
1c460 72 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  rent==0 ) return
1c470 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e   1;.  if( pParen
1c480 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75  t->pgno>1 ) retu
1c490 72 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32  rn 0;.  if( get2
1c4a0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1c4b0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1c4c0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29  rOffset+3])==0 )
1c4d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1c4e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1c4f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1c500 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1c510 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1c520 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1c530 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1c540 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1c550 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1c560 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1c570 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1c580 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1c590 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1c5a0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1c5b0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1c5c0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1c5d0 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1c5e0 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1c5f0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1c600 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
1c610 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1c620 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
1c630 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
1c640 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
1c650 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
1c660 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c670 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1c680 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1c690 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
1c6a0 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
1c6b0 73 73 65 72 74 28 20 21 69 73 52 6f 6f 74 50 61  ssert( !isRootPa
1c6c0 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
1c6d0 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
1c6e0 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
1c6f0 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
1c700 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70  .  idxParent = p
1c710 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
1c720 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
1c730 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
1c740 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
1c750 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
1c760 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
1c770 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
1c780 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
1c790 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1c7a0 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
1c7b0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
1c7c0 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
1c7d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1c7e0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1c7f0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1c800 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1c810 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1c820 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1c830 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c840 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
1c850 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
1c860 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 69 66 28 20  ee->pBt;..  if( 
1c870 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c880 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1c890 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72   ){.    clearCur
1c8a0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1c8b0 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  );.  }.  pRoot =
1c8c0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1c8d0 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f  if( pRoot && pRo
1c8e0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
1c8f0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
1c900 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
1c910 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65  sInit );.  }else
1c920 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1c930 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1c940 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1c950 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1c960 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
1c970 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1c980 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1c990 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1c9a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c9b0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
1c9c0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
1c9d0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  );.    pCur->pPa
1c9e0 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a  ge = pRoot;.  }.
1c9f0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b    pCur->idx = 0;
1ca00 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1ca10 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1ca20 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
1ca30 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
1ca40 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
1ca50 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
1ca60 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1ca70 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1ca80 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1ca90 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1caa0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1cab0 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1cac0 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1cad0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1cae0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1caf0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1cb00 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a  , subpage);.  }.
1cb10 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1cb20 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   ((pCur->pPage->
1cb30 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
1cb40 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
1cb50 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  ALID);.  return 
1cb60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1cb70 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1cb80 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
1cb90 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1cba0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
1cbb0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
1cbc0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1cbd0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
1cbe0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
1cbf0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1cc00 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
1cc10 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
1cc20 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1cc30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1cc40 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1cc50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1cc60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1cc70 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
1cc80 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1cc90 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1cca0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1ccb0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
1ccc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1ccd0 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
1cce0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1ccf0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1cd00 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
1cd10 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
1cd20 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1cd30 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1cd40 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1cd50 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1cd60 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
1cd70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1cd80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cd90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
1cda0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1cdb0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
1cdc0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1cdd0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
1cde0 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
1cdf0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1ce00 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
1ce10 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
1ce20 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
1ce30 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
1ce40 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
1ce50 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
1ce60 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
1ce70 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
1ce80 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
1ce90 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
1cea0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
1ceb0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
1cec0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1ced0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
1cee0 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
1cef0 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
1cf00 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
1cf10 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
1cf20 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
1cf30 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1cf40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1cf50 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
1cf60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1cf70 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1cf80 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
1cf90 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1cfa0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1cfb0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1cfc0 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
1cfd0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1cfe0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
1cff0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1d000 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1d010 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1d020 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  );.    pCur->idx
1d030 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1d040 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1d050 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1d060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1d070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d080 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1d090 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20  ge->nCell - 1;. 
1d0a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1d0b0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
1d0c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d0d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1d0e0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1d0f0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1d100 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1d110 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1d120 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1d130 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1d140 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1d150 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1d160 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1d170 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1d180 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1d190 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
1d1a0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1d1b0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1d1c0 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
1d1d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1d1e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1d1f0 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70 43  urn rc;.  if( pC
1d200 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d210 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1d220 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d230 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1d240 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
1d250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d260 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1d270 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1d280 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
1d290 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20  *pRes = 0;.  rc 
1d2a0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1d2b0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
1d2c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1d2d0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1d2e0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1d2f0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1d300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1d310 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1d320 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1d330 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1d340 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1d350 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1d360 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1d370 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1d380 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1d390 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
1d3a0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d3b0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d3c0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1d3d0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1d3e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1d3f0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1d400 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1d410 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  te ){.    assert
1d420 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1d430 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
1d440 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1d450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d460 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1d470 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d480 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70  OR_VALID );.  *p
1d490 52 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  Res = 0;.  rc = 
1d4a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1d4b0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1d4c0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1d4d0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
1d4e0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
1d4f0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 70 4b 65  n entry near pKe
1d500 79 2f 6e 4b 65 79 2e 0a 2a 2a 20 52 65 74 75 72  y/nKey..** Retur
1d510 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
1d520 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
1d530 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20  EY tables, only 
1d540 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74  the nKey paramet
1d550 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  er is used.  pKe
1d560 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
1d570 20 20 46 6f 72 20 6f 74 68 65 72 20 74 61 62 6c    For other tabl
1d580 65 73 2c 20 6e 4b 65 79 20 69 73 20 74 68 65 20  es, nKey is the 
1d590 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1d5a0 6f 66 20 64 61 74 61 0a 2a 2a 20 69 6e 20 70 4b  of data.** in pK
1d5b0 65 79 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69  ey.  The compari
1d5c0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 73 70 65  son function spe
1d5d0 63 69 66 69 65 64 20 77 68 65 6e 20 74 68 65 20  cified when the 
1d5e0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 63 72  cursor was.** cr
1d5f0 65 61 74 65 64 20 69 73 20 75 73 65 64 20 74 6f  eated is used to
1d600 20 63 6f 6d 70 61 72 65 20 6b 65 79 73 2e 0a 2a   compare keys..*
1d610 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
1d620 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
1d630 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
1d640 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
1d650 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
1d660 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
1d670 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
1d680 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
1d690 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
1d6a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
1d6b0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
1d6c0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
1d6d0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
1d6e0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
1d6f0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
1d700 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
1d710 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
1d720 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a   to which the.**
1d730 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74 74   cursor is writt
1d740 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70  en to *pRes if p
1d750 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20  Res!=NULL.  The 
1d760 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  meaning of.** th
1d770 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20 66  is value is as f
1d780 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1d790 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
1d7a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1d7b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1d7c0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1d7f0 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  pKey or if the t
1d800 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
1d830 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
1d840 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
1d850 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
1d860 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
1d870 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1d880 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1d890 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
1d8b0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65  ctly matches pKe
1d8c0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
1d8d0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
1d8e0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1d8f0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1d900 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1d910 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
1d920 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a  rger than pKey..
1d930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d940 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
1d950 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1d960 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1d970 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
1d980 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1d990 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1d9a0 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72   key content for
1d9b0 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75   indices.  Not u
1d9c0 73 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f  sed by tables */
1d9d0 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  .  i64 nKey,    
1d9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d9f0 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74  e of pKey.  Or t
1da00 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  he key for table
1da10 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  s */.  int biasR
1da20 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  ight,         /*
1da30 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
1da40 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
1da50 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
1da60 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
1da70 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
1da80 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29  result flag */.)
1da90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
1daa0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1dab0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
1dac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
1dad0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1dae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1daf0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
1db00 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
1db10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1db20 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
1db30 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
1db40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1db50 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1db60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1db70 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  E_OK;.  }.  for(
1db80 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
1db90 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
1dba0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
1dbb0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1dbc0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e  r->pPage;.    in
1dbd0 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
1dbe0 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
1dbf0 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
1dc00 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
1dc10 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
1dc20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
1dc30 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1dc40 3e 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d  >intKey && pKey=
1dc50 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1dc60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1dc70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1dc80 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
1dc90 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ){.      pCur->i
1dca0 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65  dx = upr;.    }e
1dcb0 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1dcc0 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  >idx = (upr+lwr)
1dcd0 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  /2;.    }.    if
1dce0 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72  ( lwr<=upr ) for
1dcf0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1dd00 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1dd10 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1dd20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1dd30 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1dd40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1dd50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Key ){.        u
1dd60 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
1dd70 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
1dd80 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1dd90 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
1dda0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
1ddb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
1ddc0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
1ddd0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1dde0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
1ddf0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
1de00 65 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ell, &dummy);.  
1de10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1de20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
1de30 20 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65   (u64 *)&nCellKe
1de40 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
1de50 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b  nCellKey<nKey ){
1de60 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
1de70 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1de80 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b   if( nCellKey>nK
1de90 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1dea0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1deb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dec0 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
1ded0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1dee0 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c         int avail
1def0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43  able;.        pC
1df00 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a  ellKey = (void *
1df10 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1df20 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20  ur, &available, 
1df30 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  0);.        nCel
1df40 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  lKey = pCur->inf
1df50 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
1df60 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e  if( available>=n
1df70 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20  CellKey ){.     
1df80 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78       c = pCur->x
1df90 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41  Compare(pCur->pA
1dfa0 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  rg, nCellKey, pC
1dfb0 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b  ellKey, nKey, pK
1dfc0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
1dfd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
1dfe0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d  ellKey = sqliteM
1dff0 61 6c 6c 6f 63 52 61 77 28 20 6e 43 65 6c 6c 4b  allocRaw( nCellK
1e000 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
1e010 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
1e020 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e030 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1e040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e050 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e  eeKey(pCur, 0, n
1e060 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a  CellKey, (void *
1e070 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  )pCellKey);.    
1e080 20 20 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e        c = pCur->
1e090 78 43 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70  xCompare(pCur->p
1e0a0 41 72 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70  Arg, nCellKey, p
1e0b0 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  CellKey, nKey, p
1e0c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1e0d0 73 71 6c 69 74 65 46 72 65 65 28 70 43 65 6c 6c  sqliteFree(pCell
1e0e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1e0f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e100 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1e110 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e120 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1e130 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1e140 61 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  ata && !pPage->l
1e150 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1e160 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1e170 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
1e180 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
1e190 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e1b0 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1e1c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1e1d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e1e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
1e1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e200 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
1e210 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64    lwr = pCur->id
1e220 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
1e230 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
1e240 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20  pCur->idx-1;.   
1e250 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
1e260 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
1e270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e280 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1e290 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
1e2a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e2b0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1e2c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e2d0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1e2e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1e2f0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1e300 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1e310 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1e320 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1e330 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1e340 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1e350 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1e360 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1e370 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1e380 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1e390 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1e3a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1e3b0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1e3c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1e3d0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1e3e0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1e3f0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1e400 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1e410 20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   c;.      return
1e420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e430 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  }.    pCur->idx 
1e440 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  = lwr;.    pCur-
1e450 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1e460 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1e470 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
1e480 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
1e490 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e4a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1e4b0 2f 2a 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a  /* NOT REACHED *
1e4c0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  /.}../*.** Retur
1e4d0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
1e4e0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1e4f0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1e500 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1e510 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
1e520 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
1e530 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1e540 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
1e550 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
1e560 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1e570 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
1e580 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
1e590 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
1e5a0 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
1e5b0 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
1e5c0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
1e5d0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1e5e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
1e5f0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
1e600 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
1e610 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
1e620 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
1e630 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
1e640 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
1e650 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
1e660 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
1e670 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
1e680 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
1e690 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
1e6a0 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
1e6b0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
1e6c0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
1e6d0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
1e6e0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
1e6f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
1e700 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
1e710 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1e720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e730 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1e740 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1e750 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1e760 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1e770 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1e780 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1e790 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1e7a0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1e7b0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1e7c0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1e7d0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1e7e0 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
1e7f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1e800 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1e810 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e820 67 65 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74  ge;..  rc = rest
1e830 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
1e840 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1e850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e860 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1e870 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1e880 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
1e890 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1e8a0 50 61 67 65 3b 0a 20 20 69 66 28 20 43 55 52 53  Page;.  if( CURS
1e8b0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1e8c0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1e8d0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1e8e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e8f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1e900 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70  >skip>0 ){.    p
1e910 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1e920 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1e930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e940 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1e950 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73  skip = 0;..  ass
1e960 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1e970 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
1e980 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1e990 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
1e9a0 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70 43 75 72  r->idx++;.  pCur
1e9b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1e9c0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  ;.  if( pCur->id
1e9d0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1e9e0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
1e9f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1ea00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ea10 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
1ea20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ea30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ea40 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
1ea50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ea60 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1ea70 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1ea80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1ea90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1eaa0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
1eab0 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 6f  .      if( isRoo
1eac0 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1ead0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1eae0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
1eaf0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1eb00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1eb10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eb20 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1eb30 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
1eb40 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1eb50 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1eb60 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
1eb70 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  r->idx>=pPage->n
1eb80 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
1eb90 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
1eba0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29  Page->leafData )
1ebb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1ebc0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
1ebd0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1ebe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1ebf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ec00 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
1ec10 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
1ec20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  ;.  if( pPage->l
1ec30 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
1ec40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ec50 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65  .  rc = moveToLe
1ec60 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1ec70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ec80 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
1ec90 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
1eca0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
1ecb0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1ecc0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1ecd0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1ece0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1ecf0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1ed00 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1ed10 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
1ed20 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1ed30 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1ed40 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1ed50 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1ed60 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1ed70 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1ed80 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
1ed90 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1eda0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
1edb0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61  no pgno;.  MemPa
1edc0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 72 63  ge *pPage;..  rc
1edd0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1ede0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1edf0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1ee00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ee10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ee20 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1ee30 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ee40 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1ee50 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ee60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ee70 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1ee80 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
1ee90 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1eea0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1eeb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1eec0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1eed0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
1eee0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
1eef0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1ef00 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1ef10 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29  ( pCur->idx>=0 )
1ef20 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1ef30 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1ef40 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e   = get4byte( fin
1ef50 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1ef60 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72  r->idx) );.    r
1ef70 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ef80 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
1ef90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1efa0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
1efb0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1efc0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
1efd0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
1efe0 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  dx==0 ){.      i
1eff0 66 28 20 69 73 52 6f 6f 74 50 61 67 65 28 70 50  f( isRootPage(pP
1f000 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1f010 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1f020 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1f030 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1f040 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f050 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f060 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
1f070 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1f080 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1f090 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20  ->pPage;.    }. 
1f0a0 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a     pCur->idx--;.
1f0b0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1f0c0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Size = 0;.    if
1f0d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74  ( pPage->leafDat
1f0e0 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  a && !pPage->lea
1f0f0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1f100 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1f110 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
1f120 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f130 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1f140 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
1f150 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
1f160 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f170 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
1f180 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
1f190 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1f1a0 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
1f1b0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
1f1c0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
1f1d0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
1f1e0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
1f1f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1f200 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
1f210 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
1f220 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
1f230 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
1f240 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
1f250 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
1f260 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
1f270 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
1f280 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
1f290 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
1f2a0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
1f2b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f2c0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
1f2d0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
1f2e0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1f2f0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
1f300 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
1f310 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
1f320 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
1f330 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
1f340 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
1f350 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f360 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
1f370 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
1f380 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1f390 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
1f3a0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
1f3b0 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
1f3c0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
1f3d0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
1f3e0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
1f3f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
1f400 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
1f410 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
1f420 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
1f430 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
1f440 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
1f450 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
1f460 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
1f470 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
1f480 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
1f490 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
1f4a0 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
1f4b0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1f4c0 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
1f4d0 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
1f4e0 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
1f4f0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
1f500 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
1f510 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
1f520 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
1f530 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
1f540 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1f550 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
1f560 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
1f570 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1f580 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1f590 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
1f5a0 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
1f5b0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
1f5c0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
1f5d0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
1f5e0 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
1f5f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1f600 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1f610 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
1f620 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1f630 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
1f640 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt k;     /* Num
1f650 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
1f660 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
1f670 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1f680 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
1f690 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1f6a0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
1f6b0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
1f6c0 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67  >pPage1;.  n = g
1f6d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1f6e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69  >aData[36]);.  i
1f6f0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
1f700 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
1f710 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1f720 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
1f730 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
1f740 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
1f750 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
1f760 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
1f770 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
1f780 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1f790 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
1f7a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1f7b0 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
1f7c0 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
1f7d0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
1f7e0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
1f7f0 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
1f800 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
1f810 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
1f820 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
1f830 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
1f840 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
1f850 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1f860 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
1f870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f880 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f890 20 20 20 69 66 28 20 65 78 61 63 74 20 29 7b 0a     if( exact ){.
1f8a0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
1f8b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
1f8c0 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
1f8d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1f8e0 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
1f8f0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1f900 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
1f910 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
1f920 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f930 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
1f940 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1f950 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
1f960 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
1f970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
1f980 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
1f990 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1f9a0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1f9b0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
1f9c0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
1f9d0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
1f9e0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
1f9f0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
1fa00 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
1fa10 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
1fa20 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
1fa30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fa40 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1fa50 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1fa60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1fa70 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1fa80 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1fa90 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
1faa0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
1fab0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
1fac0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
1fad0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
1fae0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
1faf0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
1fb00 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
1fb10 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
1fb20 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
1fb30 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
1fb40 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
1fb50 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
1fb60 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
1fb70 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
1fb80 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
1fb90 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
1fba0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
1fbb0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1fbc0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1fbd0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
1fbe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
1fbf0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1fc00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1fc10 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1fc20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
1fc30 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
1fc40 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  unk, 0);.      i
1fc50 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1fc60 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1fc70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1fc80 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1fc90 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
1fca0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1fcb0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1fcc0 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
1fcd0 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
1fce0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1fcf0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
1fd00 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
1fd10 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
1fd20 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
1fd30 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
1fd40 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
1fd50 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
1fd60 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
1fd70 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
1fd80 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1fd90 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
1fda0 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
1fdb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fdc0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1fdd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fde0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fdf0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1fe00 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1fe10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fe20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
1fe30 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1fe40 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1fe50 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1fe60 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1fe70 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1fe80 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
1fe90 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1fea0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1feb0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1fec0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1fed0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1fee0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
1fef0 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
1ff00 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
1ff10 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1ff20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
1ff30 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
1ff40 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
1ff50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ff60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ff70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1ff80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1ff90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ffa0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ffb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1ffc0 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
1ffd0 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
1ffe0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
1fff0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
20000 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
20010 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
20020 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
20030 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
20040 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
20050 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
20060 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20070 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
20080 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
20090 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
200a0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
200b0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
200c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
200d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
200e0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
200f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
20110 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
20120 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
20130 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
20140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
20150 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
20160 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
20170 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
20180 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
20190 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
201a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
201b0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
201c0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
201d0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
201e0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
201f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20200 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
20220 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
20230 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
20240 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
20250 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
20260 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
20270 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
20280 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
20290 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
202a0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
202b0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
202c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
202d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
202e0 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
202f0 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
20300 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
20310 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
20320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
20330 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
20340 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
20350 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
20360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
20380 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
20390 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
203a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
203b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
203c0 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
203d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
203e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
203f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20400 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20410 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
20420 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
20430 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
20440 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
20450 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
20460 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
20470 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
20480 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
20490 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
204a0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
204b0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
204c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
204d0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
204e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
204f0 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
20500 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
20510 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
20520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20530 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
20540 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
20550 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20560 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
20570 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
20580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
205a0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
205b0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
205c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
205d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
205e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
205f0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
20600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20610 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20620 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
20630 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
20640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
20660 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
20670 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
20680 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
20690 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
206a0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
206b0 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
206c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
206d0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
206e0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
206f0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  nk */.        in
20700 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  t closest;.     
20710 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
20720 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
20730 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
20740 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
20750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20760 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
20770 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
20780 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
20790 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
207a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
207b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
207c0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
207d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
207e0 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20  t i, dist;.     
207f0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
20800 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
20810 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
20820 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
20830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
20840 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
20850 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
20860 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
20870 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
20880 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
20890 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
208a0 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
208b0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
208c0 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
208d0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
208e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
208f0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
20900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20910 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
20920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
20940 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
20950 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
20960 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
20970 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
20980 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
20990 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
209a0 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
209b0 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
209c0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
209d0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
209e0 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
209f0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
20a00 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20a10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
20a20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f    /* Free page o
20a30 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
20a40 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
20a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20a60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20a70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20a80 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
20a90 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
20aa0 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
20ab0 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
20ad0 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
20ae0 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
20af0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
20b00 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
20b10 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
20b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20b30 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
20b40 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
20b50 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
20b60 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
20b70 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
20b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20b90 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
20ba0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
20bb0 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67       rc = getPag
20bc0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
20bd0 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20  pPage, 1);.     
20be0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20bf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20c10 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28  erDontRollback((
20c20 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
20c30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
20c40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20c50 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
20c60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20c70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20c90 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
20ca0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
20cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20cc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20cd0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
20ce0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
20cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
20d00 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
20d10 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
20d20 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
20d30 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
20d40 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
20d50 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
20d60 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
20d70 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
20d80 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
20d90 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
20da0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
20db0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c      *pPgno = sql
20dc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
20dd0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
20de0 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  + 1;..#ifndef SQ
20df0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20e00 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
20e10 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
20e20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63    /* An incr-vac
20e30 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20  uum has already 
20e40 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  run within this 
20e50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
20e60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  the.      ** pag
20e70 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73  e to allocate is
20e80 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68   not from the ph
20e90 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68  ysical end of th
20ea0 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20  e file, but.    
20eb0 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72    ** at pBt->nTr
20ec0 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  unc. .      */. 
20ed0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42       *pPgno = pB
20ee0 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20  t->nTrunc+1;.   
20ef0 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50     if( *pPgno==P
20f00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20f10 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
20f20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
20f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
20f40 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
20f50 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
20f60 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
20f70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
20f80 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
20f90 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
20fa0 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
20fb0 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
20fc0 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
20fd0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
20fe0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
20ff0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
21000 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
21010 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
21020 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
21030 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
21040 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
21050 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
21060 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
21070 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
21080 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
21090 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
210a0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
210b0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
210c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
210d0 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50  t) );.      (*pP
210e0 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gno)++;.    }.  
210f0 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
21100 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  c ){.      pBt->
21110 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b  nTrunc = *pPgno;
21120 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
21130 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
21140 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
21150 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
21160 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
21170 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
21180 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
21190 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
211a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
211b0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
211c0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
211d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
211e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
211f0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
21200 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
21210 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
21220 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
21230 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
21240 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
21250 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
21260 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
21270 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
21280 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
21290 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
212a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
212b0 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  vTrunk);.  retur
212c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
212d0 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65  dd a page of the
212e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
212f0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
21300 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  **.** sqlite3Pag
21310 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54  erUnref() is NOT
21320 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67   called for pPag
21330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21340 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
21350 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53  e *pPage){.  BtS
21360 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
21370 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61  ge->pBt;.  MemPa
21380 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
21390 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20  ->pPage1;.  int 
213a0 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20  rc, n, k;..  /* 
213b0 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65  Prepare the page
213c0 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a   for freeing */.
213d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
213e0 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
213f0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
21400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
21410 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
21420 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
21430 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
21440 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
21450 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
21460 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
21470 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21480 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
21490 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
214a0 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
214b0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
214c0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
214d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
214e0 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
214f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
21500 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
21510 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
21520 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
21530 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
21540 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
21550 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
21560 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
21570 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
21580 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
21590 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
215a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
215b0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
215c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
215d0 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
215e0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
215f0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
21600 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ze);.#endif..#if
21610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21620 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
21630 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
21640 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
21650 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
21660 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
21670 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
21680 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
21690 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
216a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
216b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
216c0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
216d0 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67  t(pBt, pPage->pg
216e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  no, PTRMAP_FREEP
216f0 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
21700 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21710 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
21720 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( n==0 ){.    /
21730 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69  * This is the fi
21740 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f  rst free page */
21750 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21760 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
21770 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
21780 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
21790 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   rc;.    memset(
217a0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
217b0 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74   8);.    put4byt
217c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
217d0 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
217e0 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22  o);.    TRACE(("
217f0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69  FREE-PAGE: %d fi
21800 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70  rst\n", pPage->p
21810 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
21820 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65      /* Other fre
21830 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  e pages already 
21840 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20  exist.  Retrive 
21850 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
21860 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  page.    ** of t
21870 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
21880 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e  find out how man
21890 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e  y leaves it has.
218a0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
218b0 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20  *pTrunk;.    rc 
218c0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 67  = getPage(pBt, g
218d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
218e0 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
218f0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
21900 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
21910 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
21920 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
21930 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
21940 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
21950 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
21960 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
21970 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
21980 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
21990 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
219a0 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
219b0 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
219c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
219d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
219e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
219f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
21a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21a10 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
21a20 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d  ->aData, pTrunk-
21a30 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 75  >pgno);.      pu
21a40 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
21a50 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
21a60 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
21a70 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
21a80 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
21a90 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
21aa0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
21ab0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
21ac0 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ng %d\n",.      
21ad0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
21ae0 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  gno, pTrunk->pgn
21af0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
21b00 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
21b10 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61 67   newly freed pag
21b20 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74  e as a leaf on t
21b30 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b  he current trunk
21b40 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
21b50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
21b60 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
21b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21b90 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
21ba0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
21bb0 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , k+1);.        
21bc0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
21bd0 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20  ->aData[8+k*4], 
21be0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69  pPage->pgno);.#i
21bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
21c00 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
21c10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
21c20 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
21c30 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  pDbPage);.#endif
21c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
21c50 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
21c60 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
21c70 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
21c80 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
21c90 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
21ca0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21cb0 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72  pTrunk);.  }.  r
21cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21cd0 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
21ce0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
21cf0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
21d00 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74  iven Cell..*/.st
21d10 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
21d20 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
21d30 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
21d40 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68   *pCell){.  BtSh
21d50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
21d60 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
21d70 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
21d80 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
21d90 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
21da0 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53  .  int ovflPageS
21db0 69 7a 65 3b 0a 0a 20 20 70 61 72 73 65 43 65 6c  ize;..  parseCel
21dc0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
21dd0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
21de0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
21df0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
21e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
21e10 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
21e20 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
21e30 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
21e40 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
21e50 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
21e60 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
21e70 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67  low]);.  ovflPag
21e80 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
21e90 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
21ea0 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
21eb0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
21ec0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
21ed0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
21ee0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
21ef0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
21f00 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
21f10 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
21f20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
21f30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
21f40 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e  no==0 || ovflPgn
21f50 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o>sqlite3PagerPa
21f60 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
21f70 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ger) ){.      re
21f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21f90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
21fa0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65  .    rc = getOve
21fb0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
21fc0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
21fd0 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f   (nOvfl==0)?0:&o
21fe0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66  vflPgno);.    if
21ff0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
22000 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  ;.    rc = freeP
22010 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
22020 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22030 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
22040 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
22050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22070 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
22080 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
22090 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
220a0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
220b0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
220c0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
220d0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
220e0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
220f0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
22100 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
22110 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
22120 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
22130 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
22140 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
22150 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
22160 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
22170 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
22180 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
22190 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
221a0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
221b0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
221c0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
221d0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
221e0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
221f0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
22200 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
22210 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
22220 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
22230 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
22240 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
22250 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
22260 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
22270 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
22280 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
22290 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
222a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
222b0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
222c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
222d0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
222e0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
222f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
22300 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
22310 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
22320 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
22330 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
22340 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
22350 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
22360 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
22370 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
22380 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
22390 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
223a0 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
223b0 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
223c0 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
223f0 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
22400 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
22410 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
22420 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
22430 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
22440 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
22450 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
22460 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
22470 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
22480 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
22490 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
224a0 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
224b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
224c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
224d0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
224e0 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
224f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
22500 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
22510 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
22520 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
22530 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
22540 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
22550 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
22560 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
22570 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
22580 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
22590 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
225a0 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
225b0 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
225c0 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
225d0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
225e0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
225f0 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
22600 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72  ;.  parseCellPtr
22610 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
22620 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
22630 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
22640 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
22650 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
22660 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
22670 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61   info.nData==nDa
22680 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20  ta+nZero );.  . 
22690 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
226a0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
226b0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
226c0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
226d0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
226e0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
226f0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
22700 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
22710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
22720 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
22730 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
22740 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79  .    nSrc = nKey
22750 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
22760 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
22770 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
22780 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
22790 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
227a0 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
227b0 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
227c0 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
227d0 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
227e0 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
227f0 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
22800 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
22810 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
22820 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
22830 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
22840 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
22850 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
22860 67 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  ge */.#endif.   
22870 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
22880 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
22890 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
228a0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
228b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
228c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
228d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
228e0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
228f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
22900 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
22910 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
22920 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
22930 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
22940 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
22950 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
22960 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
22970 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
22980 2e 20 54 68 65 20 65 6e 74 72 79 20 66 6f 72 20  . The entry for 
22990 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
229a0 6f 77 20 70 61 67 65 20 77 69 6c 6c 20 62 65 0a  ow page will be.
229b0 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 6c        ** added l
229c0 61 74 65 72 2c 20 62 79 20 74 68 65 20 69 6e 73  ater, by the ins
229d0 65 72 74 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ertCell() routin
229e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
229f0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
22a00 61 63 75 75 6d 20 26 26 20 70 67 6e 6f 50 74 72  acuum && pgnoPtr
22a10 6d 61 70 21 3d 30 20 26 26 20 72 63 3d 3d 53 51  map!=0 && rc==SQ
22a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22a30 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
22a40 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
22a50 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
22a60 32 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  2, pgnoPtrmap);.
22a70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
22a80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
22a90 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
22aa0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
22ab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
22ac0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
22ad0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
22ae0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
22af0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22b00 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
22b10 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
22b20 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
22b30 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
22b40 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
22b50 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
22b60 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
22b70 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
22b80 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
22b90 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
22ba0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
22bb0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
22bc0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
22bd0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
22be0 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  eft;.    if( nSr
22bf0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
22c00 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
22c10 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
22c20 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
22c30 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
22c40 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
22c50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
22c60 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
22c70 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
22c80 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
22c90 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
22ca0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
22cb0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
22cc0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
22cd0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
22ce0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
22cf0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
22d00 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
22d10 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
22d20 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
22d30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22d40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
22d50 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67  hange the MemPag
22d60 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e.pParent pointe
22d70 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68  r on the page wh
22d80 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ose number is.**
22d90 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
22da0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f  cond argument so
22db0 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50   that MemPage.pP
22dc0 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a  arent holds the.
22dd0 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
22de0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
22df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22e00 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53  reparentPage(BtS
22e10 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
22e20 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
22e30 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20  pNewParent, int 
22e40 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  idx){.  MemPage 
22e50 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65  *pThis;.  DbPage
22e60 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
22e70 73 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74  sert( pNewParent
22e80 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  !=0 );.  if( pgn
22e90 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
22ea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
22eb0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  t( pBt->pPager!=
22ec0 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  0 );.  pDbPage =
22ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
22ee0 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
22ef0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
22f00 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68  bPage ){.    pTh
22f10 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  is = (MemPage *)
22f20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
22f30 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
22f40 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73     if( pThis->is
22f50 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Init ){.      as
22f60 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61  sert( pThis->aDa
22f70 74 61 3d 3d 28 73 71 6c 69 74 65 33 50 61 67 65  ta==(sqlite3Page
22f80 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
22f90 29 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  )) );.      if( 
22fa0 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d  pThis->pParent!=
22fb0 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20  pNewParent ){.  
22fc0 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
22fd0 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74  >pParent ) sqlit
22fe0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 68  e3PagerUnref(pTh
22ff0 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62  is->pParent->pDb
23000 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
23010 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20  This->pParent = 
23020 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  pNewParent;.    
23030 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
23040 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e  Ref(pNewParent->
23050 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
23060 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69  }.      pThis->i
23070 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a  dxParent = idx;.
23080 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23090 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
230a0 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  age);.  }..#ifnd
230b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
230c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
230d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
230e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74  ){.    return pt
230f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
23100 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
23110 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e   pNewParent->pgn
23120 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  o);.  }.#endif. 
23130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23140 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  K;.}..../*.** Ch
23150 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74  ange the pParent
23160 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20   pointer of all 
23170 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67  children of pPag
23180 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a  e to point back.
23190 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a  ** to pPage..**.
231a0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
231b0 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69  s, for every chi
231c0 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76  ld of pPage, inv
231d0 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65  oke reparentPage
231e0 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75  ().** to make su
231f0 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69  re that each chi
23200 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50  ld knows that pP
23210 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e  age is its paren
23220 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
23230 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
23240 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63  d after you memc
23250 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e  py() one page in
23260 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a  to.** another..*
23270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
23280 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
23290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
232a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68  .  int i;.  BtSh
232b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
232c0 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e->pBt;.  int rc
232d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
232e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
232f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
23300 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  _OK;..  for(i=0;
23310 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
23320 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
23330 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
23340 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
23350 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
23360 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  ){.      rc = re
23370 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
23380 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
23390 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
233a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
233b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
233c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
233d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
233e0 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
233f0 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
23400 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
23410 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
23420 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20  set+8]), .      
23430 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
23440 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
23450 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
23460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
23470 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
23480 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
23490 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
234a0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
234b0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
234c0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
234d0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
234e0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
234f0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
23500 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
23510 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
23520 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
23530 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
23540 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
23550 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
23560 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
23570 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
23580 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
23590 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
235a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
235b0 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
235c0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
235d0 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
235e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
235f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
23600 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
23610 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
23620 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
23630 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
23640 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
23650 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
23660 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
23670 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
23680 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
23690 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
236a0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
236b0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
236c0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
236d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
236e0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
236f0 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
23700 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
23710 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
23720 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
23730 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
23740 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
23750 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
23760 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
23770 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
23780 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28  (ptr);.  assert(
23790 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c   pc>10 && pc+sz<
237a0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
237b0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65  bleSize );.  fre
237c0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
237d0 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69  , sz);.  for(i=i
237e0 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
237f0 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
23800 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
23810 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
23820 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
23830 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
23840 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
23850 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
23860 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
23870 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
23880 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
23890 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
238a0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
238b0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
238c0 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
238d0 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
238e0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
238f0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
23900 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
23910 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
23920 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
23930 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
23940 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
23950 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
23960 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
23970 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
23980 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
23990 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
239a0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
239b0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
239c0 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
239d0 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
239e0 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
239f0 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
23a00 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
23a10 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
23a20 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
23a30 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
23a40 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
23a50 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
23a60 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
23a70 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
23a80 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
23a90 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
23aa0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
23ab0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
23ac0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
23ad0 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
23ae0 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
23af0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
23b00 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
23b10 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
23b20 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
23b30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
23b40 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
23b50 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
23b60 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
23b70 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
23b80 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
23b90 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
23ba0 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
23bb0 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
23bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
23bd0 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
23be0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
23bf0 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
23c00 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
23c10 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
23c20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
23c30 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
23c40 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
23c50 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
23c60 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
23c70 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
23c80 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
23c90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
23ca0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
23cb0 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
23cc0 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
23cd0 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
23ce0 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
23cf0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
23d00 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
23d10 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
23d20 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
23d30 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
23d40 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
23d50 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
23d60 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
23d70 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
23d80 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
23d90 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
23da0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
23db0 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
23dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23dd0 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
23de0 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
23df0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
23e00 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
23e10 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
23e20 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
23e30 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
23e40 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
23e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
23e60 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
23e70 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
23e80 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
23e90 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
23ea0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
23eb0 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
23ec0 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
23ed0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
23ee0 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
23ef0 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
23f00 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
23f10 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
23f20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23f30 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
23f40 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
23f50 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
23f60 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
23f70 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
23f80 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
23f90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
23fa0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
23fb0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
23fc0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
23fd0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
23fe0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
23ff0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
24000 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24010 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
24020 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
24030 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24040 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
24050 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
24060 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
24070 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
24080 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
24090 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
240a0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
240b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
240c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
240d0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
240e0 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  j<sizeof(pPage->
240f0 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
24100 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29  age->aOvfl[0]) )
24110 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
24120 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
24130 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
24140 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69  aOvfl[j].idx = i
24150 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
24160 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
24170 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
24180 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64  e->aData;.    hd
24190 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
241a0 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20  fset;.    top = 
241b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
241c0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+5]);.    cell
241d0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
241e0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
241f0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
24200 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
24210 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d  l + 2;.    ins =
24220 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
24230 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e  i;.    if( end >
24240 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20   top - sz ){.   
24250 20 20 20 69 6e 74 20 72 63 20 3d 20 64 65 66 72     int rc = defr
24260 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
24270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
24280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24290 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f  urn rc;.      to
242a0 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
242b0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
242c0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20    assert( end + 
242d0 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20  sz <= top );.   
242e0 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c   }.    idx = all
242f0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
24300 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72  , sz);.    asser
24310 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20  t( idx>0 );.    
24320 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67  assert( end <= g
24330 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
24340 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61  r+5]) );.    pPa
24350 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
24360 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
24370 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   2;.    memcpy(&
24380 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
24390 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
243a0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72  -nSkip);.    for
243b0 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64  (j=end-2, ptr=&d
243c0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
243d0 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
243e0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
243f0 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
24400 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
24410 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
24420 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
24430 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
24440 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
24450 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
24460 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
24470 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
24480 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24490 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
244a0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
244b0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
244c0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
244d0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
244e0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
244f0 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
24500 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
24510 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
24520 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
24530 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
24540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
24550 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
24560 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
24570 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
24580 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  info);.      ass
24590 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
245a0 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
245b0 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
245c0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
245d0 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e        if( (info.
245e0 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
245f0 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
24600 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
24610 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70  {.        Pgno p
24620 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
24630 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
24640 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
24650 20 20 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72      int rc = ptr
24660 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
24670 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
24680 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
24690 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
246a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
246b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
246c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
246d0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
246e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
246f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
24700 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
24710 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
24720 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
24730 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
24740 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
24750 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
24760 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
24770 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
24780 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
24790 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
247a0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
247b0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
247c0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
247d0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
247e0 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
247f0 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
24800 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
24810 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24820 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
24830 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 69 7a 65   */.  int *aSize
24840 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
24850 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
24860 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
24870 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
24880 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
24890 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
248a0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
248b0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
248c0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
248d0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
248e0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
248f0 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
24900 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
24910 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
24920 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
24930 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
24940 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
24950 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
24960 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
24970 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
24980 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
24990 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
249a0 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  0 );.  totalSize
249b0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
249c0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
249d0 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
249e0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
249f0 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
24a00 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
24a10 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
24a20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
24a30 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70  ll==0 );.  cellp
24a40 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  tr = pPage->cell
24a50 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
24a60 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
24a70 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
24a80 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62  rOffset;.  put2b
24a90 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
24aa0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , nCell);.  if( 
24ab0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c  nCell ){.    cel
24ac0 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65  lbody = allocate
24ad0 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74  Space(pPage, tot
24ae0 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  alSize);.    ass
24af0 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20  ert( cellbody>0 
24b00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24b10 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32  Page->nFree >= 2
24b20 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  *nCell );.    pP
24b30 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a  age->nFree -= 2*
24b40 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69  nCell;.    for(i
24b50 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
24b60 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  ){.      put2byt
24b70 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d  e(&data[cellptr]
24b80 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
24b90 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
24ba0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
24bb0 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
24bc0 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b  .      cellptr +
24bd0 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62  = 2;.      cellb
24be0 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ody += aSize[i];
24bf0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24c00 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61  t( cellbody==pPa
24c10 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
24c20 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ize );.  }.  pPa
24c30 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  ge->nCell = nCel
24c40 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
24c50 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
24c60 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
24c70 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
24c80 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
24c90 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
24ca0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
24cb0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
24cc0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
24cd0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
24ce0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
24cf0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
24d00 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
24d10 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
24d20 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
24d30 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
24d40 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
24d50 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
24d60 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
24d70 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
24d80 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
24d90 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
24da0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
24db0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
24dc0 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
24dd0 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
24de0 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
24df0 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
24e00 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
24e10 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
24e20 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
24e30 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
24e40 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
24e50 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
24e60 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
24e70 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
24e80 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
24e90 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
24ea0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
24eb0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
24ec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24ed0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
24ee0 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
24ef0 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
24f00 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
24f10 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
24f20 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
24f30 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  lance */../* For
24f40 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
24f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
24f60 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69  ance(MemPage*, i
24f70 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nt);..#ifndef SQ
24f80 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
24f90 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
24fa0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
24fb0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
24fc0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
24fd0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
24fe0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
24ff0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
25000 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
25010 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
25020 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
25030 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
25040 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
25050 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
25060 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
25070 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
25080 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
25090 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
250a0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
250b0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
250c0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
250d0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
250e0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
250f0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
25100 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
25110 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
25120 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
25130 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
25140 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
25150 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
25160 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
25170 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
25180 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
25190 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
251a0 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
251b0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
251c0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
251d0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
251e0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
251f0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
25200 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
25210 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
25220 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
25230 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
25240 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
25250 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
25260 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
25270 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
25280 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
25290 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
252a0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
252b0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
252c0 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
252d0 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74  *pParent){.  int
252e0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
252f0 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  pNew;.  Pgno pgn
25300 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c  oNew;.  u8 *pCel
25310 6c 3b 0a 20 20 69 6e 74 20 73 7a 43 65 6c 6c 3b  l;.  int szCell;
25320 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
25330 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
25340 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
25350 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20    int parentIdx 
25360 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
25370 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e  ;   /* pParent n
25380 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
25390 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70  index */.  int p
253a0 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  arentSize;      
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253c0 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69  Size of new divi
253d0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  der cell */.  u8
253e0 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b   parentCell[64];
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65  /* Space for the
25410 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
25420 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  l */..  /* Alloc
25430 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
25440 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
25450 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
25460 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
25470 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
25480 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
25490 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
254a0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
254b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
254c0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
254d0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
254e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
254f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25500 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  pCell = pPage
25510 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
25520 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  ;.  szCell = cel
25530 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
25540 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61  pCell);.  zeroPa
25550 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e  ge(pNew, pPage->
25560 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73  aData[0]);.  ass
25570 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
25580 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
25590 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ll);.  pPage->nO
255a0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
255b0 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e  /* Set the paren
255c0 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61  t of the newly a
255d0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f  llocated page to
255e0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70   pParent. */.  p
255f0 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
25600 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
25610 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
25620 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
25630 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72  /* pPage is curr
25640 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d  ently the right-
25650 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
25660 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20  . Change this.  
25670 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ** so that the r
25680 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68  ight-child is th
25690 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63  e new page alloc
256a0 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20  ated above and. 
256b0 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65   ** pPage is the
256c0 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63   next-to-right c
256d0 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  hild. .  */.  as
256e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
256f0 6c 6c 3e 30 20 29 3b 0a 20 20 70 61 72 73 65 43  ll>0 );.  parseC
25700 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69  ellPtr(pPage, fi
25710 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
25720 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 2c 20 26  age->nCell-1), &
25730 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69  info);.  rc = fi
25740 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
25750 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c  , parentCell, 0,
25760 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
25770 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65  , 0, &parentSize
25780 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
25790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
257a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
257b0 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
257c0 65 3c 36 34 20 29 3b 0a 20 20 72 63 20 3d 20 69  e<64 );.  rc = i
257d0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
257e0 74 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61  t, parentIdx, pa
257f0 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74  rentCell, parent
25800 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69  Size, 0, 4);.  i
25810 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25820 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
25830 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  c;.  }.  put4byt
25840 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
25850 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e  ll(pParent,paren
25860 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67  tIdx), pPage->pg
25870 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  no);.  put4byte(
25880 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
25890 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
258a0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
258b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
258c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
258d0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
258e0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
258f0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
25900 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
25910 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69  .  ** with entri
25920 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
25930 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
25940 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
25950 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
25960 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
25970 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
25980 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25990 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
259a0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
259b0 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
259c0 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
259d0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
259e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
259f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25a00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
25a10 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
25a20 65 77 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ew, 0);.    if( 
25a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25a40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
25a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
25a60 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  if..  /* Release
25a70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
25a80 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  o the new page a
25a90 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  nd balance the p
25aa0 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a  arent page,.  **
25ab0 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69 76   in case the div
25ac0 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74  ider cell insert
25ad0 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f 20  ed caused it to 
25ae0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e  become overfull.
25af0 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50  .  */.  releaseP
25b00 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  age(pNew);.  ret
25b10 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72  urn balance(pPar
25b20 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69  ent, 0);.}.#endi
25b30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
25b40 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
25b50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 53 41 55  ../*.** The ISAU
25b60 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 20 69  TOVACUUM macro i
25b70 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 62 61  s used within ba
25b80 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
25b90 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
25ba0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
25bb0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
25bc0 63 75 75 6d 20 6f 72 20 6e 6f 74 2e 20 42 65 63  cuum or not. Bec
25bd0 61 75 73 65 20 69 74 20 69 73 20 75 73 65 64 0a  ause it is used.
25be0 2a 2a 20 77 69 74 68 69 6e 20 61 6e 20 65 78 70  ** within an exp
25bf0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
25c00 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61  an argument to a
25c10 6e 6f 74 68 65 72 20 6d 61 63 72 6f 20 0a 2a 2a  nother macro .**
25c20 20 28 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61   (sqliteMallocRa
25c30 77 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  w), it is not po
25c40 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 63 6f  ssible to use co
25c50 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d 70 69 6c  nditional compil
25c60 61 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 2c 20 74 68  ation..** So, th
25c70 69 73 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  is macro is defi
25c80 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ned instead..*/.
25c90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25ca0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 23  MIT_AUTOVACUUM.#
25cb0 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56 41 43  define ISAUTOVAC
25cc0 55 55 4d 20 28 70 42 74 2d 3e 61 75 74 6f 56 61  UUM (pBt->autoVa
25cd0 63 75 75 6d 29 0a 23 65 6c 73 65 0a 23 64 65 66  cuum).#else.#def
25ce0 69 6e 65 20 49 53 41 55 54 4f 56 41 43 55 55 4d  ine ISAUTOVACUUM
25cf0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
25d00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
25d10 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
25d20 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
25d30 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
25d40 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
25d50 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
25d60 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
25d70 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
25d80 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
25d90 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
25da0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
25db0 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
25dc0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
25dd0 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
25de0 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
25df0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
25e00 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
25e10 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
25e20 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
25e30 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
25e40 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
25e50 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
25e60 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
25e70 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
25e80 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
25e90 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
25ea0 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
25eb0 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
25ec0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
25ed0 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
25ee0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
25ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
25f00 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
25f10 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
25f20 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
25f30 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
25f40 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
25f50 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
25f60 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
25f70 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
25f80 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
25f90 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
25fa0 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
25fb0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
25fc0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
25fd0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
25fe0 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
25ff0 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
26000 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
26010 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
26020 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
26030 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
26040 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
26050 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
26060 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
26070 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
26080 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
26090 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
260a0 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
260b0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
260c0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
260d0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
260e0 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
260f0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
26100 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
26110 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
26120 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
26130 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
26140 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
26150 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
26160 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
26170 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
26180 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
26190 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
261a0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
261b0 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
261c0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
261d0 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
261e0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
261f0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
26200 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
26210 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
26220 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
26230 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
26240 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
26250 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
26260 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
26270 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
26280 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
26290 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
262a0 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
262b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
262c0 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
262d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
262e0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
262f0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
26300 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65  _nonroot(MemPage
26310 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
26320 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  age *pParent;   
26330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26340 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20  parent of pPage 
26350 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
26360 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
26370 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
26380 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
26390 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263b0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
263c0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
263d0 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
263e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
263f0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
26400 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
26410 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
26420 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
26430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26440 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
26450 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
26460 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
26470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26480 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
26490 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
264a0 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
264b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
264c0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
264d0 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
264e0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
264f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26500 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
26510 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26530 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
26540 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
26550 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
26560 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
26570 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
26580 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
26590 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
265a0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
265d0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
265e0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
265f0 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
26600 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
26610 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
26620 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
26630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26640 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
26650 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
26660 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
26670 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
26680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
26690 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
266a0 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
266b0 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
266c0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
266d0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
266e0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
266f0 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
26720 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
26730 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
26740 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b 20 20  nt iSpace = 0;  
26750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26760 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
26770 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a 2f 0a   of aSpace[] */.
26780 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
26790 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
267a0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
267b0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
267c0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
267d0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
267e0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
267f0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
26800 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
26810 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
26820 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
26830 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
26840 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
26850 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
26860 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
26870 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
26880 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
26890 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
268a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
268b0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
268c0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
268d0 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
268e0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
268f0 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26910 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
26920 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
26930 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
26940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26950 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
26960 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
26970 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
26980 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
26990 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
269a0 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
269b0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
269c0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
269d0 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
269e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
269f0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
26a00 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a  ced */.  int *sz
26a10 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
26a20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
26a30 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
26a40 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
26a50 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a70 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
26a80 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f  ing data of apCo
26a90 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  py[] */.  u8 *aS
26aa0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
26ab0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
26ac0 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73 20 6f  to hold copies o
26ad0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
26ae0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
26af0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26b00 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d  UM.  u8 *aFrom =
26b10 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   0;.#endif..  /*
26b20 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20   .  ** Find the 
26b30 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a  parent page..  *
26b40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
26b50 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
26b60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
26b70 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
26b80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
26b90 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
26ba0 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20  >pBt;.  pParent 
26bb0 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
26bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
26bd0 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ent );.  if( SQL
26be0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
26bf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26c00 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
26c10 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
26c20 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45   rc;.  }.  TRACE
26c30 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
26c40 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
26c50 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
26c60 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
26c70 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
26c80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
26c90 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
26ca0 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
26cb0 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
26cc0 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
26cd0 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
26ce0 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
26cf0 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
26d00 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
26d10 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
26d20 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
26d30 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
26d40 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
26d50 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
26d60 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
26d70 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
26d80 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
26d90 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
26da0 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
26db0 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
26dc0 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
26dd0 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
26de0 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
26df0 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
26e00 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
26e10 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
26e20 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
26e30 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
26e40 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
26e50 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
26e60 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
26e70 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
26e80 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a  nOverflow==1 &&.
26e90 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76        pPage->aOv
26ea0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
26eb0 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20  ->nCell &&.     
26ec0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
26ed0 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
26ee0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
26ef0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
26f00 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
26f10 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
26f20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
26f30 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
26f40 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74 68  e siblings to th
26f50 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65 2e  e left of pPage.
26f60 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74 0a   It may be that.
26f70 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
26f80 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20  not full and no 
26f90 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71 75  new page is requ
26fa0 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
26fb0 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f   return balance_
26fc0 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50 61  quick(pPage, pPa
26fd0 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rent);.  }.#endi
26fe0 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
26ff0 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  d the cell in th
27000 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68  e parent page wh
27010 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70  ose left child p
27020 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20  oints back.  ** 
27030 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22  to pPage.  The "
27040 69 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73  idx" variable is
27050 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
27060 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61  at cell.  If pPa
27070 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72  ge.  ** is the r
27080 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ightmost child o
27090 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73  f pParent then s
270a0 65 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e  et idx to pParen
270b0 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20  t->nCell .  */. 
270c0 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64   if( pParent->id
270d0 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67  xShift ){.    Pg
270e0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e  no pgno;.    pgn
270f0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
27100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
27110 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
27120 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
27130 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
27140 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c   for(idx=0; idx<
27150 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
27160 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  idx++){.      if
27170 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
27180 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78  ell(pParent, idx
27190 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ))==pgno ){.    
271a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
271b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
271c0 65 72 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74  ert( idx<pParent
271d0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
271e0 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65       || get4byte
271f0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
27200 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
27210 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b  set+8])==pgno );
27220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
27230 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  x = pPage->idxPa
27240 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rent;.  }..  /*.
27250 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
27260 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61  variables so tha
27270 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66  t it will be saf
27280 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64  e to jump.  ** d
27290 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e  irectly to balan
272a0 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e  ce_cleanup at an
272b0 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  y moment..  */. 
272c0 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30   nOld = nNew = 0
272d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
272e0 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
272f0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  Page);..  /*.  *
27300 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
27310 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
27320 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
27330 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
27340 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
27350 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
27360 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
27370 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
27380 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
27390 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
273a0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
273b0 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
273c0 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
273d0 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
273e0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
273f0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
27400 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
27410 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
27420 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
27430 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
27440 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
27450 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
27460 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
27470 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
27480 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
27490 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
274a0 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
274b0 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
274c0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
274d0 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
274e0 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
274f0 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
27500 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
27510 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
27520 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
27530 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
27540 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
27550 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
27560 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
27570 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27580 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
27590 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
275a0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
275b0 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
275c0 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
275d0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
275e0 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
275f0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
27600 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
27610 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
27620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
27630 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
27640 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
27650 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
27660 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50  ], &apOld[i], pP
27670 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  arent);.    if( 
27680 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
27690 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
276a0 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65  pOld[i]->idxPare
276b0 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f  nt = k;.    apCo
276c0 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
276d0 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
276e0 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
276f0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
27700 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
27710 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
27720 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
27730 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
27740 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 20 69   multiple of 2 i
27750 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
27760 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
27770 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
27780 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
27790 43 65 6c 6c 73 20 2b 20 31 29 26 7e 31 3b 0a 0a  Cells + 1)&~1;..
277a0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
277b0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
277c0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
277d0 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
277e0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
277f0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
27800 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27820 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
27830 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
27840 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 69 6e 74  Cells*sizeof(int
27850 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
27860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
27870 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
27880 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
27890 6d 50 61 67 65 29 29 2a 4e 42 20 20 20 20 20 20  mPage))*NB      
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278b0 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20  /* aCopy */.    
278c0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
278d0 2a 28 35 2b 4e 42 29 20 20 20 20 20 20 20 20 20  *(5+NB)         
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a     /* aSpace */.
27900 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
27910 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
27920 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20 20   : 0)           
27930 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
27940 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 61 70  */.  );.  if( ap
27950 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
27960 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
27970 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
27980 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
27990 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a    szCell = (int*
279a0 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
279b0 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
279c0 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
279d0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
279e0 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
279f0 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
27a00 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
27a10 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
27a20 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28  quired */.  for(
27a30 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b  i=1; i<NB; i++){
27a40 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20  .    aCopy[i] = 
27a50 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d  &aCopy[i-1][pBt-
27a60 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38  >pageSize+ROUND8
27a70 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
27a80 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  )];.    assert( 
27a90 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38  ((aCopy[i] - (u8
27aa0 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
27ab0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
27ac0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
27ad0 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
27ae0 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d  e = &aCopy[NB-1]
27af0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
27b00 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
27b10 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72  Page))];.  asser
27b20 74 28 20 28 28 61 53 70 61 63 65 20 2d 20 28 75  t( ((aSpace - (u
27b30 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
27b40 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
27b50 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
27b60 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ed */.#ifndef SQ
27b70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27b80 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
27b90 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
27ba0 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63    aFrom = &aSpac
27bb0 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a  e[5*pBt->pageSiz
27bc0 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e];.  }.#endif. 
27bd0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
27be0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
27bf0 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
27c00 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
27c10 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
27c20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
27c30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
27c40 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
27c50 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
27c60 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
27c70 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
27c80 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
27c90 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
27ca0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
27cb0 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
27cc0 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
27cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
27ce0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
27cf0 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
27d00 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
27d10 61 43 6f 70 79 5b 69 5d 5b 70 42 74 2d 3e 70 61  aCopy[i][pBt->pa
27d20 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 2d 3e  geSize];.    p->
27d30 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
27d40 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
27d50 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
27d60 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
27d70 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
27d80 67 65 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28  geSize + sizeof(
27d90 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 2f  MemPage));.    /
27da0 2a 20 54 68 65 20 6d 65 6d 63 70 79 28 29 20 61  * The memcpy() a
27db0 62 6f 76 65 20 63 68 61 6e 67 65 73 20 74 68 65  bove changes the
27dc0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 61 44 61   value of p->aDa
27dd0 74 61 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  ta so we have to
27de0 0a 20 20 20 20 2a 2a 20 73 65 74 20 69 74 20 61  .    ** set it a
27df0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  gain. */.    p->
27e00 61 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70  aData = &((u8*)p
27e10 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
27e20 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  ];.  }..  /*.  *
27e30 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
27e40 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
27e50 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
27e60 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
27e70 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
27e80 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
27e90 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
27ea0 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
27eb0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
27ec0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
27ed0 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d  ed form aSpace[]
27ee0 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
27ef0 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
27f00 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
27f10 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
27f20 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
27f30 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
27f40 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
27f50 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
27f60 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
27f70 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
27f80 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
27f90 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
27fa0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
27fb0 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74   aSpace[].  In t
27fc0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
27fd0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
27fe0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
27ff0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
28000 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
28010 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
28020 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
28030 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
28040 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
28050 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
28060 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
28070 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
28080 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
28090 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
280a0 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
280b0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
280c0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
280d0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
280e0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
280f0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
28100 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
28110 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
28120 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
28130 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
28140 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
28150 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
28160 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
28170 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b   && pPage->leaf;
28180 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
28190 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
281a0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
281b0 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
281c0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
281d0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
281e0 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
281f0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
28200 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28210 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
28220 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
28230 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
28240 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
28250 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
28260 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
28270 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
28280 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
28290 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
282a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
282b0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
282c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
282d0 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
282e0 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
282f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
28300 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
28310 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
28320 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
28330 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
28340 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
28350 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
28360 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
28370 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
28380 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
28390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
283a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
283b0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
283c0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
283d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
283e0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
283f0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
28400 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
28410 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
28420 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
28430 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
28440 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
28450 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
28460 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
28470 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
28480 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
28490 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
284a0 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
284b0 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
284c0 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
284d0 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
284e0 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
284f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
28500 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
28510 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
28520 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
28530 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
28540 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
28550 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
28560 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
28570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28580 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
28590 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
285a0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
285b0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
285c0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
285d0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
285e0 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
285f0 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
28600 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
28610 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
28620 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
28630 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
28640 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
28650 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
28660 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
28670 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
28680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28690 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
286a0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
286b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
286c0 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
286d0 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
286e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
286f0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
28700 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
28710 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
28720 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
28730 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
28740 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
28750 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
28760 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
28770 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
28780 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
28790 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
287a0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
287b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
287c0 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
287d0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
287e0 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
287f0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
28800 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
28810 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
28820 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28830 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
28840 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
28850 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
28860 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
28870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
28880 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
28890 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
288a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43      }.        nC
288b0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
288c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
288d0 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   ** Figure out t
288e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
288f0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  es needed to hol
28900 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c  d all nCell cell
28910 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68  s..  ** Store th
28920 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22  is number in "k"
28930 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20  .  Also compute 
28940 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  szNew[] which is
28950 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20   the total.  ** 
28960 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
28970 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61  s on the i-th pa
28980 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20  ge and cntNew[] 
28990 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64  which is the ind
289a0 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c  ex.  ** in apCel
289b0 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  l[] of the cell 
289c0 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67  that divides pag
289d0 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b  e i from page i+
289e0 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77  1.  .  ** cntNew
289f0 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c  [k] should equal
28a00 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a   nCell..  **.  *
28a10 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65  * Values compute
28a20 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a  d by this block:
28a30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28a40 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61       k: The tota
28a50 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  l number of sibl
28a60 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20  ing pages.  **  
28a70 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63    szNew[i]: Spac
28a80 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69  ed used on the i
28a90 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
28aa0 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b  ..  **   cntNew[
28ab0 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43  i]: Index in apC
28ac0 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c  ell[] and szCell
28ad0 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  [] for the first
28ae0 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20   cell to.  **   
28af0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
28b00 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68  ight of the i-th
28b10 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
28b20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a   ** usableSpace:
28b30 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
28b40 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61   of space availa
28b50 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c  ble on each sibl
28b60 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a  ing..  ** .  */.
28b70 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20    usableSpace = 
28b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28b90 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65  - 12 + leafCorre
28ba0 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62  ction;.  for(sub
28bb0 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e  total=k=i=0; i<n
28bc0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
28bd0 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65  assert( i<nMaxCe
28be0 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f  lls );.    subto
28bf0 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d  tal += szCell[i]
28c00 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75   + 2;.    if( su
28c10 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53  btotal > usableS
28c20 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a  pace ){.      sz
28c30 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
28c40 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  l - szCell[i];. 
28c50 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d       cntNew[k] =
28c60 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   i;.      if( le
28c70 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d  afData ){ i--; }
28c80 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20  .      subtotal 
28c90 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a  = 0;.      k++;.
28ca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
28cb0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
28cc0 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
28cd0 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
28ce0 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
28cf0 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
28d00 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
28d10 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
28d20 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
28d30 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
28d40 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
28d50 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
28d60 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
28d70 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
28d80 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
28d90 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
28da0 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
28db0 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
28dc0 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
28dd0 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
28de0 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
28df0 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
28e00 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
28e10 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
28e20 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
28e30 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
28e40 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
28e50 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
28e60 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
28e70 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
28e80 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
28e90 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
28ea0 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
28eb0 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
28ec0 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
28ed0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
28ee0 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
28ef0 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
28f00 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
28f10 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
28f20 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
28f30 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
28f40 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
28f50 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
28f60 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
28f70 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
28f80 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
28f90 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
28fa0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
28fb0 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
28fc0 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
28fd0 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
28fe0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28ff0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
29000 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
29010 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
29020 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
29030 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
29040 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
29050 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
29060 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
29070 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
29080 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
29090 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
290a0 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
290b0 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
290c0 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
290d0 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
290e0 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
290f0 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
29100 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
29110 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
29120 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
29130 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
29140 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
29150 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
29160 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
29170 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
29180 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
29190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
291a0 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
291b0 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
291c0 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77  tnew[0])>0) or w
291d0 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61  e are the.  ** a
291e0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
291f0 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
29200 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
29210 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
29220 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
29230 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
29240 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
29250 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
29260 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
29270 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
29280 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
29290 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
292a0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41   );..  /*.  ** A
292b0 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
292c0 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
292d0 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
292e0 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ible..  */.  ass
292f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
29300 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67  >1 );.  pageFlag
29310 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  s = pPage->aData
29320 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
29330 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
29340 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
29350 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
29360 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
29370 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
29380 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
29390 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b  i] = pgnoOld[i];
293a0 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
293b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
293c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
293d0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
293e0 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
293f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
29400 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
29410 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nup;.    }else{.
29420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
29430 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
29440 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
29450 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
29460 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e  gnoNew[i], pgnoN
29470 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20  ew[i-1], 0);.   
29480 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29490 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
294a0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
294b0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
294c0 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  New++;.    }.   
294d0 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
294e0 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  pageFlags);.  }.
294f0 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
29500 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
29510 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
29520 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
29530 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
29540 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
29550 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
29560 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
29570 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29580 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
29590 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
295a0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
295b0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
295c0 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
295d0 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
295e0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
295f0 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
29600 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
29610 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
29620 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
29630 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
29640 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
29650 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
29660 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
29670 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
29680 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
29690 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
296a0 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
296b0 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
296c0 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
296d0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
296e0 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
296f0 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
29700 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
29710 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
29720 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
29730 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
29740 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
29750 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
29760 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
29770 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
29780 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
29790 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
297a0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
297b0 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
297c0 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
297d0 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
297e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
297f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
29800 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69  minV = pgnoNew[i
29810 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  ];.    int minI 
29820 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
29830 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
29840 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77       if( pgnoNew
29850 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  [j]<(unsigned)mi
29860 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
29870 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
29880 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a  minV = pgnoNew[j
29890 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
298a0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
298b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a  ){.      int t;.
298c0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
298d0 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e  T;.      t = pgn
298e0 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  oNew[i];.      p
298f0 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
29900 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
29910 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   pgnoNew[minI];.
29920 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
29930 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
29940 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49      pgnoNew[minI
29950 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e  ] = t;.      apN
29960 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
29970 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
29980 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
29990 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20   %d %d %d  new: 
299a0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
299b0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
299c0 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f  d)\n",.    pgnoO
299d0 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64  ld[0], .    nOld
299e0 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d  >=2 ? pgnoOld[1]
299f0 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
29a00 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a  3 ? pgnoOld[2] :
29a10 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b   0,.    pgnoNew[
29a20 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  0], szNew[0],.  
29a30 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f    nNew>=2 ? pgno
29a40 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[1] : 0, nNew
29a50 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
29a60 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
29a70 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30  ? pgnoNew[2] : 0
29a80 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
29a90 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
29aa0 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=4 ? pgnoNew[
29ab0 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  3] : 0, nNew>=4 
29ac0 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
29ad0 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67      nNew>=5 ? pg
29ae0 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e  noNew[4] : 0, nN
29af0 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
29b00 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20   : 0));..  /*.  
29b10 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
29b20 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
29b30 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
29b40 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
29b50 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
29b60 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
29b70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
29b80 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
29b90 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
29ba0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
29bb0 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
29bc0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
29bd0 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
29be0 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
29bf0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
29c00 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
29c10 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
29c20 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d  pgno==pgnoNew[i]
29c30 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65   );.    assemble
29c40 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
29c50 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
29c60 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
29c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
29c80 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
29c90 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
29ca0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
29cb0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
29cc0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69  erflow==0 );..#i
29cd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29ce0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
29cf0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
29d00 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
29d10 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
29d20 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
29d30 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68  ntries.    ** th
29d40 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  at point to the 
29d50 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65  siblings that we
29d60 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54  re rearranged. T
29d70 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66  hese can be: lef
29d80 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65  t.    ** childre
29d90 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20  n of cells, the 
29da0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
29db0 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72  he page, or over
29dc0 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
29dd0 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
29de0 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  cells..    */.  
29df0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
29e00 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66  acuum ){.      f
29e10 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
29e20 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
29e30 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
29e40 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
29e50 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
29e60 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
29e70 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
29e80 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
29e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29ea0 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
29eb0 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
29ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29ee0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
29ef0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
29f00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
29f20 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  if..    j = cntN
29f30 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
29f40 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
29f50 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
29f60 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
29f70 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29f80 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
29f90 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
29fa0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
29fb0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
29fc0 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
29fd0 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
29fe0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
29ff0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2a000 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
2a010 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
2a020 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2a030 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
2a040 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
2a050 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
2a060 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2a070 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
2a080 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2a090 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
2a0a0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
2a0b0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
2a0c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2a0d0 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09 2f 2a   leafData ){../*
2a0e0 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
2a0f0 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
2a100 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
2a110 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
2a120 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2a130 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
2a140 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
2a150 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
2a160 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
2a170 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
2a180 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
2a190 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
2a1a0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
2a1b0 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
2a1c0 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
2a1d0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
2a1e0 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
2a1f0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
2a200 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
2a210 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 61 72  j--;.        par
2a220 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
2a230 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
2a240 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
2a250 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
2a260 65 5d 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c  e];.        fill
2a270 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
2a280 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e  pCell, 0, info.n
2a290 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73  Key, 0, 0, 0, &s
2a2a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  z);.        iSpa
2a2b0 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
2a2c0 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
2a2d0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
2a2e0 35 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  5 );.        pTe
2a2f0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
2a300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
2a310 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
2a320 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2a330 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  [iSpace];.      
2a340 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a    iSpace += sz;.
2a350 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a360 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67  iSpace<=pBt->pag
2a370 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20  eSize*5 );.     
2a380 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e   }.      rc = in
2a390 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
2a3a0 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
2a3b0 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20  sz, pTemp, 4);. 
2a3c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a3d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
2a3e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2a3f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2a400 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2a410 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70  Parent,nxDiv), p
2a420 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  New->pgno);.#ifn
2a430 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a440 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2a450 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2a460 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2a470 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20  tabase, and not 
2a480 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
2a490 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2a4a0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2a4b0 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65  er map with an e
2a4c0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2a4d0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
2a4e0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c   ** that the cel
2a4f0 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20  l just inserted 
2a500 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e  points to (if an
2a510 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
2a520 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2a530 56 61 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44  Vacuum && !leafD
2a540 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
2a550 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2a560 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2a570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a590 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2a5a0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2a5b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a5c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a  }.#endif.      j
2a5d0 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
2a5e0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  +;.    }.  }.  a
2a5f0 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
2a600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
2a610 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
2a620 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
2a630 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
2a640 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
2a650 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
2a660 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
2a670 5d 2c 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d  ], &apCopy[nOld-
2a680 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  1]->aData[8], 4)
2a690 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
2a6a0 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  v==pParent->nCel
2a6b0 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  l+pParent->nOver
2a6c0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52  flow ){.    /* R
2a6d0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2a6e0 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  g is the right-m
2a6f0 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
2a700 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34  rent */.    put4
2a710 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2a720 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2a730 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2a740 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
2a750 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69  }else{.    /* Ri
2a760 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2a770 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69   is the left chi
2a780 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ld of the first 
2a790 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74  entry in pParent
2a7a0 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
2a7b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69   right-most divi
2a7c0 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  der entry */.   
2a7d0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
2a7e0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
2a7f0 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f  nt, nxDiv), pgno
2a800 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20  New[nNew-1]);.  
2a810 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70  }..  /*.  ** Rep
2a820 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f  arent children o
2a830 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  f all cells..  *
2a840 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
2a850 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
2a860 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
2a870 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29  dPages(apNew[i])
2a880 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2a890 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
2a8a0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2a8b0 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72    }.  rc = repar
2a8c0 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50  entChildPages(pP
2a8d0 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
2a8e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2a8f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a900 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42  up;..  /*.  ** B
2a910 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
2a920 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
2a930 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
2a940 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
2a950 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
2a960 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2a970 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
2a980 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
2a990 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2a9a0 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
2a9b0 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
2a9c0 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
2a9d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a9e0 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
2a9f0 20 29 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e   );.  rc = balan
2aa00 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  ce(pParent, 0);.
2aa10 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65    .  /*.  ** Cle
2aa20 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
2aa30 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
2aa40 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
2aa50 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c  qliteFree(apCell
2aa60 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2aa70 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2aa80 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2aa90 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
2aaa0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2aab0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2aac0 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
2aad0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
2aae0 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41  (pParent);.  TRA
2aaf0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
2ab00 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
2ab10 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
2ab20 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
2ab30 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
2ab40 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
2ab50 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell));.  return 
2ab60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2ab70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2ab80 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
2ab90 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
2aba0 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
2abb0 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
2abc0 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
2abd0 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
2abe0 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
2abf0 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
2ac00 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
2ac10 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2ac20 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
2ac30 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
2ac40 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2ac50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ac60 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
2ac70 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
2ac80 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2ac90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2aca0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
2acb0 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
2acc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2acd0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
2ace0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2acf0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2ad00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2ad10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ad20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
2ad30 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
2ad40 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
2ad50 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
2ad60 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2ad70 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
2ad80 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2ad90 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2ada0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
2adb0 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
2adc0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2add0 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20  .  int *szCell; 
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adf0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2ae00 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
2ae10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ae20 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
2ae30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ae40 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74  Cell==0 );.  pBt
2ae50 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2ae60 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d   mxCellPerPage =
2ae70 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20   MX_CELL(pBt);. 
2ae80 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
2ae90 4d 61 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c  MallocRaw( mxCel
2aea0 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66  lPerPage*(sizeof
2aeb0 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74  (u8*)+sizeof(int
2aec0 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65  )) );.  if( apCe
2aed0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
2aee0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73  QLITE_NOMEM;.  s
2aef0 7a 43 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61  zCell = (int*)&a
2af00 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50  pCell[mxCellPerP
2af10 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67  age];.  if( pPag
2af20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
2af30 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63  * The table is c
2af40 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
2af50 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42  */.    TRACE(("B
2af60 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61  ALANCE: empty ta
2af70 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ble %d\n", pPage
2af80 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
2af90 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  e{.    /* The ro
2afa0 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
2afb0 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69   but has one chi
2afc0 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ld.  Transfer th
2afd0 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  e.    ** informa
2afe0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f  tion from that o
2aff0 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68  ne child into th
2b000 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69  e root page if i
2b010 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66  t .    ** will f
2b020 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  it.  This reduce
2b030 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  s the depth of t
2b040 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a  he tree by one..
2b050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2b060 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2b070 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73  s page 1, it has
2b080 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69   less space avai
2b090 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a  lable than.    *
2b0a0 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65  * its child (due
2b0b0 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65   to the 100 byte
2b0c0 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63   header that occ
2b0d0 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  urs at the begin
2b0e0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ning.    ** of t
2b0f0 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29  he database fle)
2b100 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  , so it might no
2b110 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c  t be able to hol
2b120 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20  d all of the .  
2b130 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
2b140 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
2b150 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c  ined in the chil
2b160 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  d.  If this is t
2b170 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c  he .    ** case,
2b180 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20   then do not do 
2b190 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c  the transfer.  L
2b1a0 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74  eave page 1 empt
2b1b0 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  y except.    ** 
2b1c0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
2b1d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69  inter to the chi
2b1e0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68  ld page.  The ch
2b1f0 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ild page becomes
2b200 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74  .    ** the virt
2b210 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  ual root of the 
2b220 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
2b230 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2b240 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b250 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b260 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
2b270 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e  sert( pgnoChild>
2b280 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b290 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69   pgnoChild<=sqli
2b2a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2b2b0 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  t(pPage->pBt->pP
2b2c0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
2b2d0 3d 20 67 65 74 50 61 67 65 28 70 50 61 67 65 2d  = getPage(pPage-
2b2e0 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  >pBt, pgnoChild,
2b2f0 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20   &pChild, 0);.  
2b300 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2b310 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2b320 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nce;.    if( pPa
2b330 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  ge->pgno==1 ){. 
2b340 20 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61       rc = initPa
2b350 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
2b360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2b370 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
2b380 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2b390 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2b3a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2b3b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69  ;.      if( pChi
2b3c0 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29  ld->nFree>=100 )
2b3d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2b3e0 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69   child informati
2b3f0 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  on will fit on t
2b400 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f  he root page, so
2b410 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   do the.        
2b420 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  ** copy */.     
2b430 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2b440 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2b450 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
2b460 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
2b470 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
2b480 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2b490 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d         apCell[i]
2b4a0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69   = findCell(pChi
2b4b0 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ld,i);.         
2b4c0 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c   szCell[i] = cel
2b4d0 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c  lSizePtr(pChild,
2b4e0 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   apCell[i]);.   
2b4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2b500 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67  ssemblePage(pPag
2b510 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  e, pChild->nCell
2b520 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  , apCell, szCell
2b530 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  );.        /* Co
2b540 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  py the right-poi
2b550 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
2b560 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  d to the parent.
2b570 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34   */.        put4
2b580 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2b590 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2b5a0 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20  set+8], .       
2b5b0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
2b5c0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68  Child->aData[pCh
2b5d0 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ild->hdrOffset+8
2b5e0 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ]));.        fre
2b5f0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2b600 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
2b610 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2b620 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67   transfer to pag
2b630 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
2b640 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65  pgno));.      }e
2b650 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2b660 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f  The child has mo
2b670 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
2b680 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  hat will fit on 
2b690 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20  the root..      
2b6a0 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
2b6b0 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
2b6c0 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
2b6d0 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  */.        TRACE
2b6e0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
2b6f0 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  d %d will not fi
2b700 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20  t on page 1\n", 
2b710 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2b720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b730 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
2b740 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43  pPage->aData, pC
2b750 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61  hild->aData, pPa
2b760 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2b770 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
2b780 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
2b790 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72       pPage->pPar
2b7a0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ent = 0;.      r
2b7b0 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61  c = initPage(pPa
2b7c0 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  ge, 0);.      as
2b7d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2b7e0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65  _OK );.      fre
2b7f0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2b800 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2b810 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63  ANCE: transfer c
2b820 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f  hild %d into roo
2b830 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %d\n",.       
2b840 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70         pChild->p
2b850 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gno, pPage->pgno
2b860 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ));.    }.    rc
2b870 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64   = reparentChild
2b880 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20  Pages(pPage);.  
2b890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b8a0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2b8b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b8c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b8d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2b8e0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2b8f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
2b900 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2b910 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20  nCell; i++){ .  
2b920 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2b930 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20  pPutOvfl(pPage, 
2b940 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
2b950 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b960 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2b970 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2b980 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nce;.        }. 
2b990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2b9a0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
2b9b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2b9c0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2b9d0 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65 61 73  ance;.    releas
2b9e0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2b9f0 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62   }.end_shallow_b
2ba00 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65  alance:.  sqlite
2ba10 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
2ba20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2ba30 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  *.** The root pa
2ba40 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a  ge is overfull.*
2ba50 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68  *.** When this h
2ba60 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61  appens, Create a
2ba70 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2ba80 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20  and copy the.** 
2ba90 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2baa0 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68  root into the ch
2bab0 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20  ild.  Then make 
2bac0 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
2bad0 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
2bae0 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70  ith rightChild p
2baf0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e  ointing to the n
2bb00 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46  ew.** child.   F
2bb10 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c  inally, call bal
2bb20 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20  ance_internal() 
2bb30 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  on the new child
2bb40 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20  .** to cause it 
2bb50 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61  to split..*/.sta
2bb60 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2bb70 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
2bb80 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  pPage){.  int rc
2bb90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2bba0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
2bbb0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
2bbc0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2bbd0 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69  Child;    /* Poi
2bbe0 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68  nter to a new ch
2bbf0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ild page */.  Pg
2bc00 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
2bc10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2bc20 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
2bc30 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
2bc40 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2bc50 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
2bc60 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
2bc70 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  ize;     /* Tota
2bc80 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  l usable size of
2bc90 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20   a page */.  u8 
2bca0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
2bcb0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
2bcc0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a  he parent page *
2bcd0 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20  /.  u8 *cdata;  
2bce0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2bcf0 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  nt of the child 
2bd00 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  page */.  int hd
2bd10 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
2bd20 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20   Offset to page 
2bd30 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74  header in parent
2bd40 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20   */.  int brk;  
2bd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2bd60 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f  set to content o
2bd70 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20  f first cell in 
2bd80 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  parent */..  ass
2bd90 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
2bda0 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
2bdb0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2bdc0 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20  flow>0 );.  pBt 
2bdd0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2bde0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2bdf0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68  eePage(pBt, &pCh
2be00 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c  ild, &pgnoChild,
2be10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29   pPage->pgno, 0)
2be20 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2be30 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
2be40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2be50 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
2be60 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2be70 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
2be80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
2be90 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2bea0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
2beb0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
2bec0 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28   brk = get2byte(
2bed0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
2bee0 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
2bef0 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
2bf00 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
2bf10 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
2bf20 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
2bf30 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
2bf40 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c  cpy(&cdata[brk],
2bf50 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
2bf60 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20  bleSize-brk);.  
2bf70 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2bf80 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
2bf90 63 20 3d 20 69 6e 69 74 50 61 67 65 28 70 43 68  c = initPage(pCh
2bfa0 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69  ild, pPage);.  i
2bfb0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2bfc0 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2bfd0 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
2bfe0 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61  >aOvfl, pPage->a
2bff0 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76  Ovfl, pPage->nOv
2c000 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50  erflow*sizeof(pP
2c010 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  age->aOvfl[0]));
2c020 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
2c030 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  flow = pPage->nO
2c040 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70  verflow;.  if( p
2c050 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2c060 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e   ){.    pChild->
2c070 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  nFree = 0;.  }. 
2c080 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2c090 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e  >nCell==pPage->n
2c0a0 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61  Cell );.  zeroPa
2c0b0 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2c0c0 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
2c0d0 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62  F_LEAF);.  put4b
2c0e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c0f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2c100 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
2c110 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
2c120 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20  ANCE: copy root 
2c130 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70  %d into %d\n", p
2c140 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69  Page->pgno, pChi
2c150 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e  ld->pgno));.#ifn
2c160 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c170 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
2c180 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2c190 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2c1a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2c1b0 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70  t(pBt, pChild->p
2c1c0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2c1d0 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  E, pPage->pgno);
2c1e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2c1f0 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72  to balancedeeper
2c200 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  _out;.    for(i=
2c210 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65  0; i<pChild->nCe
2c220 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
2c230 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2c240 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20  fl(pChild, i);. 
2c250 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2c280 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
2c290 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c  endif.  rc = bal
2c2a0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68  ance_nonroot(pCh
2c2b0 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65  ild);..balancede
2c2c0 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  eper_out:.  rele
2c2d0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
2c2e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c2f0 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66  ./*.** Decide if
2c300 20 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20   the page pPage 
2c310 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
2c320 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63  nced.  If balanc
2c330 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72  ing is.** requir
2c340 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70  ed, call the app
2c350 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
2c360 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  ng routine..*/.s
2c370 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2c380 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
2c390 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20  , int insert){. 
2c3a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c3b0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
2c3c0 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a  ->pParent==0 ){.
2c3d0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
2c3e0 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
2c3f0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2c400 5f 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a  _deeper(pPage);.
2c410 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2c420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2c430 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2c440 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2c450 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70  ance_shallower(p
2c460 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
2c470 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
2c480 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2c490 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69   || .        (!i
2c4a0 6e 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e  nsert && pPage->
2c4b0 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74  nFree>pPage->pBt
2c4c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2c4d0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2c4e0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2c4f0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2c500 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c510 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2c520 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20  tine checks all 
2c530 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69  cursors that poi
2c540 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f  nt to table pgno
2c550 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20  Root..** If any 
2c560 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73  of those cursors
2c570 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74   were opened wit
2c580 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61  h wrFlag==0 in a
2c590 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61   different.** da
2c5a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2c5b0 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f  n (a database co
2c5c0 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nnection that sh
2c5d0 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a  ares the pager.*
2c5e0 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65  * cache with the
2c5f0 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74   current connect
2c600 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74  ion) and that ot
2c610 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  her connection .
2c620 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ** is not in the
2c630 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65   ReadUncommmitte
2c640 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  d state, then th
2c650 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2c660 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f  ns .** SQLITE_LO
2c670 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  CKED..**.** In a
2c680 64 64 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b  ddition to check
2c690 69 6e 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63  ing for read-loc
2c6a0 6b 73 20 28 77 68 65 72 65 20 61 20 72 65 61 64  ks (where a read
2c6b0 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20  -lock .** means 
2c6c0 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
2c6d0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20  with wrFlag==0) 
2c6e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
2c6f0 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 63  o moves.** all c
2c700 75 72 73 6f 72 73 20 77 72 69 74 65 20 63 75 72  ursors write cur
2c710 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  sors so that the
2c720 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74  y are pointing t
2c730 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  o the .** first 
2c740 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74  Cell on the root
2c750 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
2c760 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
2c770 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20  e an insert .** 
2c780 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20  or delete might 
2c790 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65  change the numbe
2c7a0 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20  r of cells on a 
2c7b0 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a  page or delete.*
2c7c0 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c  * a page entirel
2c7d0 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20  y and we do not 
2c7e0 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e  want to leave an
2c7f0 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f  y cursors .** po
2c800 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78  inting to non-ex
2c810 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20  istant pages or 
2c820 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
2c830 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
2c840 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cks(Btree *pBtre
2c850 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  e, Pgno pgnoRoot
2c860 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
2c870 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  lude){.  BtCurso
2c880 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
2c890 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
2c8a0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
2c8b0 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 70 53 71  db = pBtree->pSq
2c8c0 6c 69 74 65 3b 0a 20 20 66 6f 72 28 70 3d 70 42  lite;.  for(p=pB
2c8d0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
2c8e0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
2c8f0 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20  if( p==pExclude 
2c900 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c910 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2c920 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2c930 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c940 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e  p->pgnoRoot!=pgn
2c950 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65  oRoot ) continue
2c960 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
2c970 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  lag==0 ){.      
2c980 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72  sqlite3 *dbOther
2c990 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 70 53   = p->pBtree->pS
2c9a0 71 6c 69 74 65 3b 0a 20 20 20 20 20 20 69 66 28  qlite;.      if(
2c9b0 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20   dbOther==0 ||. 
2c9c0 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72          (dbOther
2c9d0 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
2c9e0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2c9f0 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2ca00 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
2ca10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2ca20 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
2ca30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
2ca40 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e  pPage->pgno!=p->
2ca50 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
2ca60 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b    moveToRoot(p);
2ca70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ca80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ca90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2caa0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
2cab0 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
2cac0 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
2cad0 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
2cae0 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
2caf0 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
2cb00 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
2cb10 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
2cb20 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
2cb30 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
2cb40 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
2cb50 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
2cb60 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2cb70 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2cb80 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2cb90 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
2cba0 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
2cbb0 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
2cbc0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
2cbd0 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
2cbe0 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
2cbf0 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
2cc00 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
2cc10 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
2cc20 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
2cc30 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
2cc40 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
2cc50 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2cc60 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2cc70 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
2cc80 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
2cc90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2cca0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2ccb0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2ccc0 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2ccd0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
2cce0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
2ccf0 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
2cd00 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
2cd10 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
2cd20 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
2cd30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cd40 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
2cd50 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2cd60 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
2cd70 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
2cd80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cd90 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
2cda0 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
2cdb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2cdc0 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
2cdd0 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  New;.  MemPage *
2cde0 70 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  pPage;.  BtShare
2cdf0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
2ce00 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 75 6e  Btree->pBt;.  un
2ce10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
2ce20 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
2ce30 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
2ce40 20 30 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e   0;..  if( pBt->
2ce50 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54  inTransaction!=T
2ce60 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
2ce70 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20    /* Must start 
2ce80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
2ce90 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e  fore doing an in
2cea0 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  sert */.    retu
2ceb0 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2cec0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2ced0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2cee0 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  R;.  }.  assert(
2cef0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2cf00 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
2cf10 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2cf20 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2cf30 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
2cf40 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
2cf50 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2cf60 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2cf70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
2cf80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2cf90 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2cfa0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20   SQLITE_LOCKED; 
2cfb0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
2cfc0 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
2cfd0 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
2cfe0 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2cff0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2d000 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2d010 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
2d020 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75  ble */.  clearCu
2d030 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2d040 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53  r);.  if( .    S
2d050 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2d060 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2d070 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2d080 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20  ot, pCur)) ||.  
2d090 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
2d0a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2d0b0 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
2d0c0 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
2d0d0 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  as, &loc)).  ){.
2d0e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d0f0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2d100 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2d110 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2d120 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
2d130 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d140 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
2d150 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
2d160 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
2d170 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
2d180 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
2d190 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
2d1a0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2d1b0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
2d1c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
2d1d0 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
2d1e0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
2d1f0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
2d200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d210 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d  isInit );.  rc =
2d220 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d230 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2d240 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
2d250 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 65 77 43  eturn rc;.  newC
2d260 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ell = sqliteMall
2d270 6f 63 52 61 77 28 20 4d 58 5f 43 45 4c 4c 5f 53  ocRaw( MX_CELL_S
2d280 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
2d290 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
2d2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d2b0 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
2d2c0 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
2d2d0 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
2d2e0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
2d2f0 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
2d300 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d310 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
2d320 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
2d330 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2d340 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
2d350 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
2d360 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
2d370 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26  ;.  if( loc==0 &
2d380 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  & CURSOR_VALID==
2d390 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2d3a0 20 20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20      int szOld;. 
2d3b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d3c0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
2d3d0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
2d3e0 6c 20 29 3b 0a 20 20 20 20 6f 6c 64 43 65 6c 6c  l );.    oldCell
2d3f0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2d400 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2d410 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2d420 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  eaf ){.      mem
2d430 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64  cpy(newCell, old
2d440 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a  Cell, 4);.    }.
2d450 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c      szOld = cell
2d460 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f  SizePtr(pPage, o
2d470 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20  ldCell);.    rc 
2d480 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
2d490 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
2d4a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2d4b0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64  nd_insert;.    d
2d4c0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2d4d0 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29  Cur->idx, szOld)
2d4e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
2d4f0 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  c<0 && pPage->nC
2d500 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ell>0 ){.    ass
2d510 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2d520 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64   );.    pCur->id
2d530 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x++;.    pCur->i
2d540 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2d550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2d560 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2d570 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e  );.  }.  rc = in
2d580 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20  sertCell(pPage, 
2d590 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65  pCur->idx, newCe
2d5a0 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
2d5b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2d5c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
2d5d0 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20  _insert;.  rc = 
2d5e0 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31  balance(pPage, 1
2d5f0 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42  );.  /* sqlite3B
2d600 74 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75  treePageDump(pCu
2d610 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  r->pBt, pCur->pg
2d620 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20  noRoot, 1); */. 
2d630 20 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75   /* fflush(stdou
2d640 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  t); */.  if( rc=
2d650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d660 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
2d670 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65  r);.  }.end_inse
2d680 72 74 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  rt:.  sqliteFree
2d690 28 6e 65 77 43 65 6c 6c 29 3b 0a 20 20 72 65 74  (newCell);.  ret
2d6a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d6b0 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72   Delete the entr
2d6c0 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
2d6d0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
2d6e0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2d6f0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2d700 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2d710 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  cation..*/.int s
2d720 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
2d730 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2d740 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2d750 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2d760 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
2d770 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
2d780 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
2d790 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 53  Child = 0;.  BtS
2d7a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
2d7b0 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a  r->pBtree->pBt;.
2d7c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d7d0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2d7e0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2d7f0 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2d800 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2d810 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2d820 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  tion before doin
2d830 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  g a delete */.  
2d840 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
2d850 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2d860 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2d870 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2d880 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2d890 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70  dOnly );.  if( p
2d8a0 43 75 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67  Cur->idx >= pPag
2d8b0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2d8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d8d0 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72  ROR;  /* The cur
2d8e0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
2d8f0 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ing to anything 
2d900 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43  */.  }.  if( !pC
2d910 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20  ur->wrFlag ){.  
2d920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d930 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e  PERM;   /* Did n
2d940 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72  ot open this cur
2d950 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  sor for writing 
2d960 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65  */.  }.  if( che
2d970 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72  ckReadLocks(pCur
2d980 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e  ->pBtree, pCur->
2d990 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20  pgnoRoot, pCur) 
2d9a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d9b0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20  LITE_LOCKED; /* 
2d9c0 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
2d9d0 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
2d9e0 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a  ead lock */.  }.
2d9f0 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68  .  /* Restore th
2da00 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2da10 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d   position (a no-
2da20 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  op if the cursor
2da30 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a   is not in .  **
2da40 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2da50 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73  EEK state) and s
2da60 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
2da70 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
2da80 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65  ursors .  ** ope
2da90 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  n on the same ta
2daa0 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73  ble. Then call s
2dab0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2dac0 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  () on the page. 
2dad0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74   ** that the ent
2dae0 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  ry will be delet
2daf0 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20  ed from..  */.  
2db00 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72  if( .    (rc = r
2db10 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2db20 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2db30 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2db40 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
2db50 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2db60 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30  oRoot, pCur))!=0
2db70 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71   ||.    (rc = sq
2db80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2db90 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2dba0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  !=0.  ){.    ret
2dbb0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2dbc0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  * Locate the cel
2dbd0 6c 20 77 69 74 68 69 6e 20 69 74 27 73 20 70 61  l within it's pa
2dbe0 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
2dbf0 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
2dc00 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
2dc10 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
2dc20 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
2dc30 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2dc40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
2dc50 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
2dc60 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
2dc70 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
2dc80 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2dc90 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2dca0 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50  >idx);.  if( !pP
2dcb0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2dcc0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2dcd0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2dce0 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2dcf0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2dd00 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2dd10 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
2dd20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2dd30 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2dd40 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2dd50 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2dd60 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2dd70 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2dd80 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2dd90 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2dda0 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2ddb0 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2ddc0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2ddd0 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2dde0 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2ddf0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2de00 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2de10 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2de20 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2de30 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2de40 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2de50 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2de60 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2de70 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2de80 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2de90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2dea0 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4e  ext;.    int szN
2deb0 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ext;  /* The com
2dec0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 69 73  piler warning is
2ded0 20 77 72 6f 6e 67 3a 20 73 7a 4e 65 78 74 20 69   wrong: szNext i
2dee0 73 20 61 6c 77 61 79 73 20 0a 20 20 20 20 20 20  s always .      
2def0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
2df00 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
2df10 20 75 73 65 2e 20 20 41 64 64 69 6e 67 20 61 6e   use.  Adding an
2df20 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2df30 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2df40 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 69 6c         ** to sil
2df50 65 6e 63 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  ence the compile
2df60 72 20 73 6c 6f 77 73 20 64 6f 77 6e 20 74 68 65  r slows down the
2df70 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   code. */.    in
2df80 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75  t notUsed;.    u
2df90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
2dfa0 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  mpCell = 0;.    
2dfb0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e  assert( !pPage->
2dfc0 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20  leafData );.    
2dfd0 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  getTempCursor(pC
2dfe0 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
2dff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e000 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2e010 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2e020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2e040 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2e050 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ite(leafCur.pPag
2e060 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2e070 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2e080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e090 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2e0a0 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2e0b0 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
2e0c0 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
2e0d0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2e0e0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2e0f0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2e100 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  , leafCur.pPage-
2e110 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
2e120 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2e130 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2e140 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2e150 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2e160 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61  t = findCell(lea
2e170 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2e180 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20  Cur.idx);.      
2e190 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2e1a0 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61  ePtr(leafCur.pPa
2e1b0 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
2e1c0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
2e1d0 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
2e1e0 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 74  ext+4 );.      t
2e1f0 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65  empCell = sqlite
2e200 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43 45  MallocRaw( MX_CE
2e210 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
2e220 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65        if( tempCe
2e230 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
2e240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e250 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2e260 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2e270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e280 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2e290 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2e2a0 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65  x, pNext-4, szNe
2e2b0 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20  xt+4, tempCell, 
2e2c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
2e2d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e2e0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2e2f0 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
2e300 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2e310 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29  idx), pgnoChild)
2e320 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  ;.      rc = bal
2e330 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  ance(pPage, 0);.
2e340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2e350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e360 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65       dropCell(le
2e370 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61  afCur.pPage, lea
2e380 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74  fCur.idx, szNext
2e390 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  );.      rc = ba
2e3a0 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50  lance(leafCur.pP
2e3b0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  age, 0);.    }. 
2e3c0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65     sqliteFree(te
2e3d0 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 72 65 6c  mpCell);.    rel
2e3e0 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
2e3f0 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73  leafCur);.  }els
2e400 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44  e{.    TRACE(("D
2e410 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2e420 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66  delete from leaf
2e430 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70   %d\n",.       p
2e440 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2e450 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2e460 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2e470 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c  , pCur->idx, cel
2e480 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2e490 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20  pCell));.    rc 
2e4a0 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2e4b0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
2e4c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e4d0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2e4e0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
2e4f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e500 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
2e510 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
2e520 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
2e530 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2e540 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
2e550 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2e560 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
2e570 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
2e580 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2e590 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2e5a0 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
2e5b0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
2e5c0 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
2e5d0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
2e5e0 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
2e5f0 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
2e600 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
2e610 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
2e620 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
2e630 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2e640 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
2e650 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
2e660 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
2e690 69 63 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ices.*/.int sqli
2e6a0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
2e6b0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2e6c0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2e6d0 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
2e6e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2e6f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
2e700 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
2e710 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  oot;.  int rc;. 
2e720 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2e730 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2e740 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2e750 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2e760 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f  saction first */
2e770 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
2e780 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2e790 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2e7a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2e7b0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2e7c0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66  readOnly );..#if
2e7d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e7e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20  AUTOVACUUM.  rc 
2e7f0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2e800 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c  age(pBt, &pRoot,
2e810 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30   &pgnoRoot, 1, 0
2e820 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2e830 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20  turn rc;.#else. 
2e840 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2e850 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
2e860 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20   pgnoMove;      
2e870 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68  /* Move a page h
2e880 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  ere to make room
2e890 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
2e8a0 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  ge */.    MemPag
2e8b0 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a  e *pPageMove; /*
2e8c0 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76   The page to mov
2e8d0 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e to. */..    /*
2e8e0 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   Creating a new 
2e8f0 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62  table may probab
2e900 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ly require movin
2e910 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61  g an existing da
2e920 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f  tabase.    ** to
2e930 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
2e940 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f  he new tables ro
2e950 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65  ot page. In case
2e960 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73   this page turns
2e970 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  .    ** out to b
2e980 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2e990 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f  ge, delete all o
2e9a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70  verflow page-map
2e9b0 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68   caches.    ** h
2e9c0 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73  eld by open curs
2e9d0 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ors..    */.    
2e9e0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
2e9f0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
2ea00 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
2ea10 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
2ea20 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
2ea30 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
2ea40 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
2ea50 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
2ea60 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
2ea70 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
2ea80 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
2ea90 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2eaa0 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
2eab0 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
2eac0 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page is (meta[3
2ead0 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ]+1)..    */.   
2eae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2eaf0 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20  eeGetMeta(p, 4, 
2eb00 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
2eb10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2eb20 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2eb30 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2eb40 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2eb50 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2eb60 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2eb70 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2eb80 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2eb90 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2eba0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2ebb0 20 69 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50   if( pgnoRoot==P
2ebc0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
2ebd0 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20  , pgnoRoot) ||. 
2ebe0 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d         pgnoRoot=
2ebf0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ec00 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
2ec10 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20   pgnoRoot++;.   
2ec20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2ec30 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20  gnoRoot>=3 );.. 
2ec40 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
2ec50 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20   page. The page 
2ec60 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72  that currently r
2ec70 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f  esides at pgnoRo
2ec80 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ot will.    ** b
2ec90 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61  e moved to the a
2eca0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75  llocated page (u
2ecb0 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61  nless the alloca
2ecc0 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73  ted page happens
2ecd0 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64  .    ** to resid
2ece0 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a  e at pgnoRoot)..
2ecf0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2ed00 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2ed10 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76  e(pBt, &pPageMov
2ed20 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67  e, &pgnoMove, pg
2ed30 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20  noRoot, 1);.    
2ed40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ed50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2ed60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
2ed70 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70   if( pgnoMove!=p
2ed80 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  gnoRoot ){.     
2ed90 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20   /* pgnoRoot is 
2eda0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69  the page that wi
2edb0 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ll be used for t
2edc0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a  he root-page of.
2edd0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
2ede0 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67   table (assuming
2edf0 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f   an error did no
2ee00 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65  t occur). But we
2ee10 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61   were.      ** a
2ee20 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76  llocated pgnoMov
2ee30 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28  e. If required (
2ee40 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e  i.e. if it was n
2ee50 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  ot allocated.   
2ee60 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69     ** by extendi
2ee70 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68  ng the file), th
2ee80 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61  e current page a
2ee90 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d  t position pgnoM
2eea0 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ove.      ** is 
2eeb0 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65  already journale
2eec0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
2eed0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
2eee0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
2eef0 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ..      releaseP
2ef00 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a  age(pPageMove);.
2ef10 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74  .      /* Move t
2ef20 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
2ef30 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f  y at pgnoRoot to
2ef40 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20   pgnoMove. */.  
2ef50 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2ef60 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2ef70 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2ef80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ef90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2efa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2efb0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
2efc0 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
2efd0 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
2efe0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
2eff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f000 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
2f010 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
2f020 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2f030 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2f040 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2f050 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2f060 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2f070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2f080 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
2f090 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
2f0a0 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
2f0b0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
2f0c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f0d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
2f0e0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2f0f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f110 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2f120 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2f130 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2f140 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2f150 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
2f160 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
2f170 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a  age, pgnoMove);.
2f180 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f190 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20  e(pRoot);..     
2f1a0 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70   /* Obtain the p
2f1b0 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  age at pgnoRoot 
2f1c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  */.      if( rc!
2f1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f1e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2f200 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
2f210 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2f220 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2f230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f240 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f250 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2f260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f270 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2f280 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2f290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f2a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2f2b0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2f2c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f2d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2f2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
2f2f0 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
2f300 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
2f310 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
2f320 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
2f330 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
2f340 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
2f350 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
2f360 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2f370 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
2f380 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
2f390 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f3a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f3b0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2f3c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f3e0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
2f3f0 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
2f400 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f410 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f420 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2f430 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2f440 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2f450 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2f460 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2f470 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2f480 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2f490 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2f4a0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
2f4b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f4c0 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
2f4d0 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
2f4e0 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
2f4f0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2f500 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2f510 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
2f520 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
2f530 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
2f540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f550 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  K;.}../*.** Eras
2f560 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  e the given data
2f570 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c  base page and al
2f580 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20  l its children. 
2f590 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70   Return.** the p
2f5a0 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
2f5b0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
2f5c0 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65  nt clearDatabase
2f5d0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2f5e0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
2f5f0 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68   /* The BTree th
2f600 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2f610 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  table */.  Pgno 
2f620 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
2f630 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2f640 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65  to clear */.  Me
2f650 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2f660 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
2f670 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68  ge.  NULL for th
2f680 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  e root */.  int 
2f690 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20 20  freePageFlag    
2f6a0 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20    /* Deallocate 
2f6b0 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  page if true */.
2f6c0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2f6d0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
2f6e0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
2f6f0 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
2f700 20 69 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   i;..  if( pgno>
2f710 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2f720 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2f730 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2f740 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f750 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
2f760 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2f770 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
2f780 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
2f790 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2f7a0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2f7b0 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
2f7c0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
2f7d0 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
2f7e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2f7f0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
2f800 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f810 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2f820 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2f830 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2f840 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2f850 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
2f860 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2f870 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2f880 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2f890 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2f8a0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
2f8b0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2f8c0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2f8d0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
2f8e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2f8f0 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2f900 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2f910 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2f920 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50  a[8]), pPage->pP
2f930 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69  arent, 1);.    i
2f940 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2f950 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2f960 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ut;.  }.  if( fr
2f970 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
2f980 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2f990 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pPage);.  }else 
2f9a0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
2f9b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2f9c0 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20  e->pDbPage))==0 
2f9d0 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  ){.    zeroPage(
2f9e0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
2f9f0 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
2fa00 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
2fa10 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
2fa20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2fa30 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2fa40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2fa50 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
2fa60 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
2fa70 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2fa80 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
2fa90 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
2faa0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
2fab0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
2fac0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
2fad0 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
2fae0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2faf0 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
2fb00 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
2fb10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2fb20 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2fb30 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2fb40 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2fb50 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
2fb60 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
2fb70 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
2fb80 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
2fb90 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
2fba0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  e table..*/.int 
2fbb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2fbc0 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  rTable(Btree *p,
2fbd0 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
2fbe0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
2fbf0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2fc00 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
2fc10 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2fc20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2fc30 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2fc40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2fc50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2fc60 7d 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 52 65  }.  rc = checkRe
2fc70 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
2fc80 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  e, 0);.  if( rc 
2fc90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2fca0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  ;.  }..  /* Save
2fcb0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6f 66   the position of
2fcc0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
2fcd0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
2fce0 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2fcf0 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
2fd00 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54  lCursors(pBt, iT
2fd10 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  able, 0)) ){.   
2fd20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2fd30 0a 20 20 72 65 74 75 72 6e 20 63 6c 65 61 72 44  .  return clearD
2fd40 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2fd50 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
2fd60 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  , 0);.}../*.** E
2fd70 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  rase all informa
2fd80 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20  tion in a table 
2fd90 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74  and add the root
2fda0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
2fdb0 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74  .** the freelist
2fdc0 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72  .  Except, the r
2fdd0 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63  oot of the princ
2fde0 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20  iple table (the 
2fdf0 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31  one on.** page 1
2fe00 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64  ) is never added
2fe10 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
2fe20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2fe30 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
2fe40 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
2fe50 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
2fe60 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f  ny open.** curso
2fe70 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2fe80 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
2fe90 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
2fea0 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20  and the page at 
2feb0 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68  iTable is not th
2fec0 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70  e last.** root p
2fed0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2fee0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
2fef0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2ff00 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  e .** in the dat
2ff10 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f  abase file is mo
2ff20 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f  ved into the slo
2ff30 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
2ff40 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65  ied by.** iTable
2ff50 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73   and that last s
2ff60 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
2ff70 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73  upied by the las
2ff80 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  t root page.** i
2ff90 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
2ffa0 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20  reelist instead 
2ffb0 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74  of iTable.  In t
2ffc0 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20  his say, all.** 
2ffd0 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b  root pages are k
2ffe0 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ept at the begin
2fff0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
30000 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
30010 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79  .** is necessary
30020 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20   for AUTOVACUUM 
30030 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20  to work right.  
30040 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
30050 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  to the .** page 
30060 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64  number that used
30070 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
30080 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
30090 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20   file before.** 
300a0 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f  the move.  If no
300b0 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64   page gets moved
300c0 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65  , *piMoved is se
300d0 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c  t to 0..** The l
300e0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ast root page is
300f0 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74   recorded in met
30100 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c  a[3] and the val
30110 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d  ue of.** meta[3]
30120 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74   is updated by t
30130 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a  his procedure..*
30140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30150 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
30160 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
30170 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
30180 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
30190 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
301a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
301b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 69 66   = p->pBt;..  if
301c0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
301d0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
301e0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
301f0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
30200 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
30210 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
30220 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
30230 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
30240 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
30250 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
30260 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
30270 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
30280 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
30290 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
302a0 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
302b0 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
302c0 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
302d0 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
302e0 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
302f0 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
30300 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
30310 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
30320 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
30330 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
30340 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
30350 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
30360 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
30370 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 50    }..  rc = getP
30380 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
30390 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30  Table, &pPage, 0
303a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
303b0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
303c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
303d0 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  rTable(p, iTable
303e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
303f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30400 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
30410 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69  n rc;.  }..  *pi
30420 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Moved = 0;..  if
30430 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69  ( iTable>1 ){.#i
30440 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
30450 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30460 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
30470 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  age);.    releas
30480 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65  ePage(pPage);.#e
30490 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d  lse.    if( pBt-
304a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
304b0 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f       Pgno maxRoo
304c0 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  tPgno;.      rc 
304d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
304e0 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78  tMeta(p, 4, &max
304f0 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20  RootPgno);.     
30500 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30510 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
30520 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30530 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
30540 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
30550 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d      if( iTable==
30560 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20  maxRootPgno ){. 
30570 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
30580 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
30590 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c  pped is the tabl
305a0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
305b0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
305c0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
305d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
305e0 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  put the root pag
305f0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  e on the free li
30600 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  st. .        */.
30610 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
30620 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30630 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30640 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
30650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30660 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
30690 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
306a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
306b0 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68  opped does not h
306c0 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  ave the largest 
306d0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
306e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
306f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20  he database. So 
30700 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68  move the page th
30710 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65  at does into the
30720 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70   .        ** gap
30730 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
30740 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a  eted root-page..
30750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30760 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76     MemPage *pMov
30770 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  e;.        relea
30780 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30790 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50         rc = getP
307a0 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
307b0 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
307c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
307d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
307e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
307f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30800 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
30810 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f  atePage(pBt, pMo
30820 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ve, PTRMAP_ROOTP
30830 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b  AGE, 0, iTable);
30840 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30850 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
30860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
308a0 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42   rc = getPage(pB
308b0 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
308c0 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
308d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
308e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
308f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30910 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d  rc = freePage(pM
30920 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ove);.        re
30930 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
30940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30960 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30970 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30980 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d        *piMoved =
30990 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
309a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
309b0 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78  Set the new 'max
309c0 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75  -root-page' valu
309d0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
309e0 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20  e header. This. 
309f0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f       ** is the o
30a00 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e  ld value less on
30a10 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65  e, less one more
30a20 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   if that happens
30a30 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
30a40 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  a root-page numb
30a50 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61  er, less one aga
30a60 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68  in if that is th
30a70 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49  e.      ** PENDI
30a80 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20  NG_BYTE_PAGE..  
30a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78      */.      max
30aa0 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
30ab0 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
30ac0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
30ad0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
30ae0 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
30af0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
30b00 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
30b10 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
30b20 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
30b30 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  o) ){.        ma
30b40 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
30b50 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
30b60 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d  t( maxRootPgno!=
30b70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30b80 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20  E(pBt) );..     
30b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
30ba0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
30bb0 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  4, maxRootPgno);
30bc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30bd0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
30be0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
30bf0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30c00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
30c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
30c20 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  f sqlite3BtreeDr
30c30 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c  opTable was call
30c40 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ed on page 1. */
30c50 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
30c60 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  age, PTF_INTKEY|
30c70 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20  PTF_LEAF );.    
30c80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30c90 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
30ca0 20 72 63 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   rc;  .}.../*.**
30cb0 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
30cc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
30cd0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
30ce0 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  e.  Meta[0].** i
30cf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
30d00 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65  free pages curre
30d10 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntly in the data
30d20 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a  base.  Meta[1].*
30d30 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31  * through meta[1
30d40 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  5] are available
30d50 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68   for use by high
30d60 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61  er layers.  Meta
30d70 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f  [0].** is read-o
30d80 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20  nly, the others 
30d90 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a  are read/write..
30da0 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  ** .** The schem
30db0 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20  a layer numbers 
30dc0 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66  meta values diff
30dd0 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65  erently.  At the
30de0 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72   schema.** layer
30df0 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f   (and the SetCoo
30e00 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b  kie and ReadCook
30e10 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20  ie opcodes) the 
30e20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65  number of.** fre
30e30 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76  e pages is not v
30e40 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b  isible.  So Cook
30e50 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d  ie[0] is the sam
30e60 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f  e as Meta[1]..*/
30e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
30e80 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
30e90 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
30ea0 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67  *pMeta){.  DbPag
30eb0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e  e *pDbPage;.  in
30ec0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
30ed0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
30ee0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
30ef0 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  >pBt;..  /* Read
30f00 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20  ing a meta-data 
30f10 76 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61  value requires a
30f20 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
30f30 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a  ge 1 (and hence.
30f40 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f    ** the sqlite_
30f50 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65  master table. We
30f60 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20   grab this lock 
30f70 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
30f80 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f  ether or.  ** no
30f90 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61  t the SQLITE_Rea
30fa0 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
30fb0 67 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61  g is set (the ta
30fc0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
30fd0 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65  ge.  ** 1 is tre
30fe0 61 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61  ated as a specia
30ff0 6c 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54  l case by queryT
31000 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c  ableLock() and l
31010 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a  ockTable())..  *
31020 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61  /.  rc = queryTa
31030 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
31040 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
31050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31060 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
31070 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
31080 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
31090 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
310a0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
310b0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50  pPager, 1, &pDbP
310c0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
310d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
310e0 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
310f0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
31100 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
31110 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65  );.  *pMeta = ge
31120 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
31130 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69   idx*4]);.  sqli
31140 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
31150 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  bPage);..  /* If
31160 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73   autovacuumed is
31170 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69   disabled in thi
31180 73 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61  s build but we a
31190 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20  re trying to .  
311a0 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74  ** access an aut
311b0 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61  ovacuumed databa
311c0 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68  se, then make th
311d0 65 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f  e database reado
311e0 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65  nly. .  */.#ifde
311f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31200 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69  TOVACUUM.  if( i
31210 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e  dx==4 && *pMeta>
31220 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  0 ) pBt->readOnl
31230 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20  y = 1;.#endif.. 
31240 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61   /* Grab the rea
31250 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
31260 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b  . */.  rc = lock
31270 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44  Table(p, 1, READ
31280 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e  _LOCK);.  return
31290 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
312a0 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
312b0 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
312c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
312d0 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
312e0 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
312f0 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
31300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
31310 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
31320 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
31330 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
31340 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
31350 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
31360 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
31370 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
31380 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
31390 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   );.  if( p->inT
313a0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
313b0 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
313c0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
313d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
313e0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
313f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
31400 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
31410 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
31420 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  ge1->aData;.  rc
31430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31440 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
31450 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
31460 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31470 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
31480 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69  1[36 + idx*4], i
31490 4d 65 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Meta);.  return 
314a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
314b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
314c0 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
314d0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
314e0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
314f0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
31500 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
31510 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
31520 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
31530 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
31540 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f  * TODO: What abo
31550 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ut CURSOR_REQUIR
31560 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f  ESEEK state? Pro
31570 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61  bably need to ca
31580 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f  ll.  ** restoreO
31590 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
315a0 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a  tion() here..  *
315b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
315c0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
315d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
315e0 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b   ? pPage->aData[
315f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31600 5d 20 3a 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  ] : 0;.}..#ifdef
31610 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
31620 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73 61  .** Print a disa
31630 73 73 65 6d 62 6c 79 20 6f 66 20 74 68 65 20 67  ssembly of the g
31640 69 76 65 6e 20 70 61 67 65 20 6f 6e 20 73 74 61  iven page on sta
31650 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20 54  ndard output.  T
31660 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
31670 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
31680 67 69 6e 67 20 61 6e 64 20 74 65 73 74 69 6e 67  ging and testing
31690 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
316a0 20 69 6e 74 20 62 74 72 65 65 50 61 67 65 44 75   int btreePageDu
316b0 6d 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  mp(BtShared *pBt
316c0 2c 20 69 6e 74 20 70 67 6e 6f 2c 20 69 6e 74 20  , int pgno, int 
316d0 72 65 63 75 72 73 69 76 65 2c 20 4d 65 6d 50 61  recursive, MemPa
316e0 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  ge *pParent){.  
316f0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
31700 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
31710 69 2c 20 6a 2c 20 63 3b 0a 20 20 69 6e 74 20 6e  i, j, c;.  int n
31720 46 72 65 65 3b 0a 20 20 75 31 36 20 69 64 78 3b  Free;.  u16 idx;
31730 0a 20 20 69 6e 74 20 68 64 72 3b 0a 20 20 69 6e  .  int hdr;.  in
31740 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69  t nCell;.  int i
31750 73 49 6e 69 74 3b 0a 20 20 75 6e 73 69 67 6e 65  sInit;.  unsigne
31760 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
31770 63 68 61 72 20 72 61 6e 67 65 5b 32 30 5d 3b 0a  char range[20];.
31780 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31790 70 61 79 6c 6f 61 64 5b 32 30 5d 3b 0a 0a 20 20  payload[20];..  
317a0 72 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74  rc = getPage(pBt
317b0 2c 20 28 50 67 6e 6f 29 70 67 6e 6f 2c 20 26 70  , (Pgno)pgno, &p
317c0 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 73 49 6e  Page, 0);.  isIn
317d0 69 74 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  it = pPage->isIn
317e0 69 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  it;.  if( pPage-
317f0 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
31800 20 20 69 6e 69 74 50 61 67 65 28 70 50 61 67 65    initPage(pPage
31810 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
31820 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31830 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
31840 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
31850 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
31860 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
31870 20 20 63 20 3d 20 64 61 74 61 5b 68 64 72 5d 3b    c = data[hdr];
31880 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  .  pPage->intKey
31890 20 3d 20 28 63 20 26 20 28 50 54 46 5f 49 4e 54   = (c & (PTF_INT
318a0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
318b0 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  ))!=0;.  pPage->
318c0 7a 65 72 6f 44 61 74 61 20 3d 20 28 63 20 26 20  zeroData = (c & 
318d0 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30  PTF_ZERODATA)!=0
318e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  ;.  pPage->leafD
318f0 61 74 61 20 3d 20 28 63 20 26 20 50 54 46 5f 4c  ata = (c & PTF_L
31900 45 41 46 44 41 54 41 29 21 3d 30 3b 0a 20 20 70  EAFDATA)!=0;.  p
31910 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 63 20  Page->leaf = (c 
31920 26 20 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a  & PTF_LEAF)!=0;.
31930 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
31940 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f   = !(pPage->zero
31950 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d  Data || (!pPage-
31960 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e  >leaf && pPage->
31970 6c 65 61 66 44 61 74 61 29 29 3b 0a 20 20 6e 43  leafData));.  nC
31980 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
31990 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
319a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
319b0 74 66 28 22 50 41 47 45 20 25 64 3a 20 20 66 6c  tf("PAGE %d:  fl
319c0 61 67 73 3d 30 78 25 30 32 78 20 20 66 72 61 67  ags=0x%02x  frag
319d0 3d 25 64 20 20 20 70 61 72 65 6e 74 3d 25 64 5c  =%d   parent=%d\
319e0 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20 20 64 61  n", pgno,.    da
319f0 74 61 5b 68 64 72 5d 2c 20 64 61 74 61 5b 68 64  ta[hdr], data[hd
31a00 72 2b 37 5d 2c 20 0a 20 20 20 20 28 70 50 61 67  r+7], .    (pPag
31a10 65 2d 3e 69 73 49 6e 69 74 20 26 26 20 70 50 61  e->isInit && pPa
31a20 67 65 2d 3e 70 50 61 72 65 6e 74 29 20 3f 20 70  ge->pParent) ? p
31a30 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  Page->pParent->p
31a40 67 6e 6f 20 3a 20 30 29 3b 0a 20 20 61 73 73 65  gno : 0);.  asse
31a50 72 74 28 20 68 64 72 20 3d 3d 20 28 70 67 6e 6f  rt( hdr == (pgno
31a60 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
31a70 3b 0a 20 20 69 64 78 20 3d 20 68 64 72 20 2b 20  ;.  idx = hdr + 
31a80 31 32 20 2d 20 70 50 61 67 65 2d 3e 6c 65 61 66  12 - pPage->leaf
31a90 2a 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  *4;.  for(i=0; i
31aa0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
31ab0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
31ac0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 3b  .    Pgno child;
31ad0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
31ae0 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69  ar *pCell;.    i
31af0 6e 74 20 73 7a 3b 0a 20 20 20 20 69 6e 74 20 61  nt sz;.    int a
31b00 64 64 72 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d  ddr;..    addr =
31b10 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
31b20 69 64 78 20 2b 20 32 2a 69 5d 29 3b 0a 20 20 20  idx + 2*i]);.   
31b30 20 70 43 65 6c 6c 20 3d 20 26 64 61 74 61 5b 61   pCell = &data[a
31b40 64 64 72 5d 3b 0a 20 20 20 20 70 61 72 73 65 43  ddr];.    parseC
31b50 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
31b60 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
31b70 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65   sz = info.nSize
31b80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
31b90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 72 61  printf(sizeof(ra
31ba0 6e 67 65 29 2c 72 61 6e 67 65 2c 22 25 64 2e 2e  nge),range,"%d..
31bb0 25 64 22 2c 20 61 64 64 72 2c 20 61 64 64 72 2b  %d", addr, addr+
31bc0 73 7a 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70  sz-1);.    if( p
31bd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31be0 20 20 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a 20      child = 0;. 
31bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31c00 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
31c10 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  (pCell);.    }. 
31c20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61     sz = info.nDa
31c30 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  ta;.    if( !pPa
31c40 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20  ge->intKey ) sz 
31c50 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  += info.nKey;.  
31c60 20 20 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66 28    if( sz>sizeof(
31c70 70 61 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a 20  payload)-1 ) sz 
31c80 3d 20 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64  = sizeof(payload
31c90 29 2d 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  )-1;.    memcpy(
31ca0 70 61 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c 5b  payload, &pCell[
31cb0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20 73  info.nHeader], s
31cc0 7a 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  z);.    for(j=0;
31cd0 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<sz; j++){.   
31ce0 20 20 20 69 66 28 20 70 61 79 6c 6f 61 64 5b 6a     if( payload[j
31cf0 5d 3c 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f 61  ]<0x20 || payloa
31d00 64 5b 6a 5d 3e 30 78 37 66 20 29 20 70 61 79 6c  d[j]>0x7f ) payl
31d10 6f 61 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20  oad[j] = '.';.  
31d20 20 20 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64 5b    }.    payload[
31d30 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  sz] = 0;.    sql
31d40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
31d50 0a 20 20 20 20 20 20 22 63 65 6c 6c 20 25 32 64  .      "cell %2d
31d60 3a 20 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d 25  : i=%-10s chld=%
31d70 2d 34 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64  -4d nk=%-4lld nd
31d80 3d 25 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25 73  =%-4d payload=%s
31d90 5c 6e 22 2c 0a 20 20 20 20 20 20 69 2c 20 72 61  \n",.      i, ra
31da0 6e 67 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66 6f  nge, child, info
31db0 2e 6e 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61 74  .nKey, info.nDat
31dc0 61 2c 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 29  a, payload.    )
31dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
31de0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31df0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
31e00 74 66 28 22 72 69 67 68 74 5f 63 68 69 6c 64 3a  tf("right_child:
31e10 20 25 64 5c 6e 22 2c 20 67 65 74 34 62 79 74 65   %d\n", get4byte
31e20 28 26 64 61 74 61 5b 68 64 72 2b 38 5d 29 29 3b  (&data[hdr+8]));
31e30 0a 20 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30  .  }.  nFree = 0
31e40 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 64 78  ;.  i = 0;.  idx
31e50 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
31e60 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69  a[hdr+1]);.  whi
31e70 6c 65 28 20 69 64 78 3e 30 20 26 26 20 69 64 78  le( idx>0 && idx
31e80 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
31e90 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  bleSize ){.    i
31ea0 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
31eb0 28 26 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b 0a  (&data[idx+2]);.
31ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31ed0 69 6e 74 66 28 73 69 7a 65 6f 66 28 72 61 6e 67  intf(sizeof(rang
31ee0 65 29 2c 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64  e),range,"%d..%d
31ef0 22 2c 20 69 64 78 2c 20 69 64 78 2b 73 7a 2d 31  ", idx, idx+sz-1
31f00 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20  );.    nFree += 
31f10 73 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  sz;.    sqlite3D
31f20 65 62 75 67 50 72 69 6e 74 66 28 22 66 72 65 65  ebugPrintf("free
31f30 62 6c 6f 63 6b 20 25 32 64 3a 20 69 3d 25 2d 31  block %2d: i=%-1
31f40 30 73 20 73 69 7a 65 3d 25 2d 34 64 20 74 6f 74  0s size=%-4d tot
31f50 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
31f60 20 69 2c 20 72 61 6e 67 65 2c 20 73 7a 2c 20 6e   i, range, sz, n
31f70 46 72 65 65 29 3b 0a 20 20 20 20 69 64 78 20 3d  Free);.    idx =
31f80 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
31f90 69 64 78 5d 29 3b 0a 20 20 20 20 69 2b 2b 3b 0a  idx]);.    i++;.
31fa0 20 20 7d 0a 20 20 69 66 28 20 69 64 78 21 3d 30    }.  if( idx!=0
31fb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
31fc0 65 62 75 67 50 72 69 6e 74 66 28 22 45 52 52 4f  ebugPrintf("ERRO
31fd0 52 3a 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  R: next freebloc
31fe0 6b 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  k index out of r
31ff0 61 6e 67 65 3a 20 25 64 5c 6e 22 2c 20 69 64 78  ange: %d\n", idx
32000 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 63  );.  }.  if( rec
32010 75 72 73 69 76 65 20 26 26 20 21 70 50 61 67 65  ursive && !pPage
32020 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 66 6f  ->leaf ){.    fo
32030 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
32040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 6e 73 69  i++){.      unsi
32050 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
32060 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
32070 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 62 74 72  e, i);.      btr
32080 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20  eePageDump(pBt, 
32090 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
320a0 20 31 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20   1, pPage);.    
320b0 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
320c0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  (pCell);.    }. 
320d0 20 20 20 62 74 72 65 65 50 61 67 65 44 75 6d 70     btreePageDump
320e0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
320f0 64 61 74 61 5b 68 64 72 2b 38 5d 29 2c 20 31 2c  data[hdr+8]), 1,
32100 20 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70   pPage);.  }.  p
32110 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
32120 73 49 6e 69 74 3b 0a 20 20 73 71 6c 69 74 65 33  sInit;.  sqlite3
32130 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
32140 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 66 66  ->pDbPage);.  ff
32150 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
32160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32170 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
32180 74 72 65 65 50 61 67 65 44 75 6d 70 28 42 74 72  treePageDump(Btr
32190 65 65 20 2a 70 2c 20 69 6e 74 20 70 67 6e 6f 2c  ee *p, int pgno,
321a0 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 29 7b   int recursive){
321b0 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
321c0 61 67 65 44 75 6d 70 28 70 2d 3e 70 42 74 2c 20  ageDump(p->pBt, 
321d0 70 67 6e 6f 2c 20 72 65 63 75 72 73 69 76 65 2c  pgno, recursive,
321e0 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   0);.}.#endif..#
321f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
32200 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
32210 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
32220 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 52 65 73  ./*.** Fill aRes
32230 75 6c 74 5b 5d 20 77 69 74 68 20 69 6e 66 6f 72  ult[] with infor
32240 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
32250 20 65 6e 74 72 79 20 61 6e 64 20 70 61 67 65 20   entry and page 
32260 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 73  that the.** curs
32270 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
32280 6f 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 61 52 65 73  o..** .**   aRes
32290 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65 20 70 61  ult[0] =  The pa
322a0 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ge number.**   a
322b0 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20 54 68 65  Result[1] =  The
322c0 20 65 6e 74 72 79 20 6e 75 6d 62 65 72 0a 2a 2a   entry number.**
322d0 20 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d 20     aResult[2] = 
322e0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
322f0 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73   entries on this
32300 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75   page.**   aResu
32310 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c 20 73 69  lt[3] =  Cell si
32320 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  ze (local payloa
32330 64 20 2b 20 68 65 61 64 65 72 29 0a 2a 2a 20 20  d + header).**  
32340 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d 20 20 4e   aResult[4] =  N
32350 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
32360 74 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  tes on this page
32370 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 35 5d  .**   aResult[5]
32380 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   =  Number of fr
32390 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  ee blocks on the
323a0 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75   page.**   aResu
323b0 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61 6c 20 70  lt[6] =  Total p
323c0 61 79 6c 6f 61 64 20 73 69 7a 65 20 28 6c 6f 63  ayload size (loc
323d0 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77 29 0a 2a  al + overflow).*
323e0 2a 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d  *   aResult[7] =
323f0 20 20 48 65 61 64 65 72 20 73 69 7a 65 20 69 6e    Header size in
32400 20 62 79 74 65 73 0a 2a 2a 20 20 20 61 52 65 73   bytes.**   aRes
32410 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63 61 6c 20  ult[8] =  Local 
32420 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a 2a 2a 20  payload size.** 
32430 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 20    aResult[9] =  
32440 50 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  Parent page numb
32450 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  er.**   aResult[
32460 31 30 5d 3d 20 20 50 61 67 65 20 6e 75 6d 62 65  10]=  Page numbe
32470 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
32480 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 2a 2a 0a  verflow page.**.
32490 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
324a0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
324b0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
324c0 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  g only..*/.int s
324d0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
324e0 72 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  rInfo(BtCursor *
324f0 70 43 75 72 2c 20 69 6e 74 20 2a 61 52 65 73 75  pCur, int *aResu
32500 6c 74 2c 20 69 6e 74 20 75 70 43 6e 74 29 7b 0a  lt, int upCnt){.
32510 20 20 69 6e 74 20 63 6e 74 2c 20 69 64 78 3b 0a    int cnt, idx;.
32520 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32530 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
32540 20 20 42 74 43 75 72 73 6f 72 20 74 6d 70 43 75    BtCursor tmpCu
32550 72 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 72  r;..  int rc = r
32560 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
32570 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
32580 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
32590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
325a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
325b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
325c0 73 49 6e 69 74 20 29 3b 0a 20 20 67 65 74 54 65  sInit );.  getTe
325d0 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26  mpCursor(pCur, &
325e0 74 6d 70 43 75 72 29 3b 0a 20 20 77 68 69 6c 65  tmpCur);.  while
325f0 28 20 75 70 43 6e 74 2d 2d 20 29 7b 0a 20 20 20  ( upCnt-- ){.   
32600 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 26 74   moveToParent(&t
32610 6d 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 50  mpCur);.  }.  pP
32620 61 67 65 20 3d 20 74 6d 70 43 75 72 2e 70 50 61  age = tmpCur.pPa
32630 67 65 3b 0a 20 20 61 52 65 73 75 6c 74 5b 30 5d  ge;.  aResult[0]
32640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
32650 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
32660 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 61 73 73  >pDbPage);.  ass
32670 65 72 74 28 20 61 52 65 73 75 6c 74 5b 30 5d 3d  ert( aResult[0]=
32680 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
32690 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 74    aResult[1] = t
326a0 6d 70 43 75 72 2e 69 64 78 3b 0a 20 20 61 52 65  mpCur.idx;.  aRe
326b0 73 75 6c 74 5b 32 5d 20 3d 20 70 50 61 67 65 2d  sult[2] = pPage-
326c0 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 74 6d  >nCell;.  if( tm
326d0 70 43 75 72 2e 69 64 78 3e 3d 30 20 26 26 20 74  pCur.idx>=0 && t
326e0 6d 70 43 75 72 2e 69 64 78 3c 70 50 61 67 65 2d  mpCur.idx<pPage-
326f0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 67 65  >nCell ){.    ge
32700 74 43 65 6c 6c 49 6e 66 6f 28 26 74 6d 70 43 75  tCellInfo(&tmpCu
32710 72 29 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b  r);.    aResult[
32720 33 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f  3] = tmpCur.info
32730 2e 6e 53 69 7a 65 3b 0a 20 20 20 20 61 52 65 73  .nSize;.    aRes
32740 75 6c 74 5b 36 5d 20 3d 20 74 6d 70 43 75 72 2e  ult[6] = tmpCur.
32750 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
32760 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 74 6d 70  aResult[7] = tmp
32770 43 75 72 2e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  Cur.info.nHeader
32780 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38 5d  ;.    aResult[8]
32790 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e   = tmpCur.info.n
327a0 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
327b0 20 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d      aResult[3] =
327c0 20 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b   0;.    aResult[
327d0 36 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52 65 73  6] = 0;.    aRes
327e0 75 6c 74 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20  ult[7] = 0;.    
327f0 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20 30 3b 0a  aResult[8] = 0;.
32800 20 20 7d 0a 20 20 61 52 65 73 75 6c 74 5b 34 5d    }.  aResult[4]
32810 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3b   = pPage->nFree;
32820 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 64  .  cnt = 0;.  id
32830 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50  x = get2byte(&pP
32840 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
32850 2d 3e 68 64 72 4f 66 66 73 65 74 2b 31 5d 29 3b  ->hdrOffset+1]);
32860 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3e 30 20  .  while( idx>0 
32870 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 70 42  && idx<pPage->pB
32880 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
32890 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20  .    cnt++;.    
328a0 69 64 78 20 3d 20 67 65 74 32 62 79 74 65 28 26  idx = get2byte(&
328b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 64 78  pPage->aData[idx
328c0 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 65 73 75 6c  ]);.  }.  aResul
328d0 74 5b 35 5d 20 3d 20 63 6e 74 3b 0a 20 20 69 66  t[5] = cnt;.  if
328e0 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
328f0 3d 3d 30 20 7c 7c 20 69 73 52 6f 6f 74 50 61 67  ==0 || isRootPag
32900 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
32910 61 52 65 73 75 6c 74 5b 39 5d 20 3d 20 30 3b 0a  aResult[9] = 0;.
32920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65    }else{.    aRe
32930 73 75 6c 74 5b 39 5d 20 3d 20 70 50 61 67 65 2d  sult[9] = pPage-
32940 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3b 0a  >pParent->pgno;.
32950 20 20 7d 0a 20 20 69 66 28 20 74 6d 70 43 75 72    }.  if( tmpCur
32960 2e 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20  .info.iOverflow 
32970 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31  ){.    aResult[1
32980 30 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 74  0] = get4byte(&t
32990 6d 70 43 75 72 2e 69 6e 66 6f 2e 70 43 65 6c 6c  mpCur.info.pCell
329a0 5b 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76  [tmpCur.info.iOv
329b0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 7d 65 6c 73  erflow]);.  }els
329c0 65 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 31  e{.    aResult[1
329d0 30 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  0] = 0;.  }.  re
329e0 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
329f0 26 74 6d 70 43 75 72 29 3b 0a 20 20 72 65 74 75  &tmpCur);.  retu
32a00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32a10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
32a20 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61  turn the pager a
32a30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
32a40 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f   BTree.  This ro
32a50 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
32a60 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
32a70 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
32a80 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74  .*/.Pager *sqlit
32a90 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72  e3BtreePager(Btr
32aa0 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
32ab0 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b   p->pBt->pPager;
32ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  .}../*.** This s
32ad0 74 72 75 63 74 75 72 65 20 69 73 20 70 61 73 73  tructure is pass
32ae0 65 64 20 61 72 6f 75 6e 64 20 74 68 72 6f 75 67  ed around throug
32af0 68 20 61 6c 6c 20 74 68 65 20 73 61 6e 69 74 79  h all the sanity
32b00 20 63 68 65 63 6b 69 6e 67 20 72 6f 75 74 69 6e   checking routin
32b10 65 73 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  es.** in order t
32b20 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  o keep track of 
32b30 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 73 74 61 74  some global stat
32b40 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  e information..*
32b50 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
32b60 20 49 6e 74 65 67 72 69 74 79 43 6b 20 49 6e 74   IntegrityCk Int
32b70 65 67 72 69 74 79 43 6b 3b 0a 73 74 72 75 63 74  egrityCk;.struct
32b80 20 49 6e 74 65 67 72 69 74 79 43 6b 20 7b 0a 20   IntegrityCk {. 
32b90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
32ba0 20 20 20 2f 2a 20 54 68 65 20 74 72 65 65 20 62     /* The tree b
32bb0 65 69 6e 67 20 63 68 65 63 6b 65 64 20 6f 75 74  eing checked out
32bc0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
32bd0 67 65 72 3b 20 20 20 20 2f 2a 20 54 68 65 20 61  ger;    /* The a
32be0 73 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e  ssociated pager.
32bf0 20 20 41 6c 73 6f 20 61 63 63 65 73 73 69 62 6c    Also accessibl
32c00 65 20 62 79 20 70 42 74 2d 3e 70 50 61 67 65 72  e by pBt->pPager
32c10 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
32c20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32c30 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
32c40 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
32c50 69 6e 74 20 2a 61 6e 52 65 66 3b 20 20 20 20 20  int *anRef;     
32c60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
32c70 69 6d 65 73 20 65 61 63 68 20 70 61 67 65 20 69  imes each page i
32c80 73 20 72 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a  s referenced */.
32c90 20 20 69 6e 74 20 6d 78 45 72 72 3b 20 20 20 20    int mxErr;    
32ca0 20 20 20 20 2f 2a 20 53 74 6f 70 20 61 63 63 75      /* Stop accu
32cb0 6d 75 6c 61 74 69 6e 67 20 65 72 72 6f 72 73 20  mulating errors 
32cc0 77 68 65 6e 20 74 68 69 73 20 72 65 61 63 68 65  when this reache
32cd0 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 68 61 72  s zero */.  char
32ce0 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f 2a   *zErrMsg;    /*
32cf0 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   An error messag
32d00 65 2e 20 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 65  e.  NULL if no e
32d10 72 72 6f 72 73 20 73 65 65 6e 2e 20 2a 2f 0a 20  rrors seen. */. 
32d20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
32d30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32d40 6d 65 73 73 61 67 65 73 20 77 72 69 74 74 65 6e  messages written
32d50 20 74 6f 20 7a 45 72 72 4d 73 67 20 73 6f 20 66   to zErrMsg so f
32d60 61 72 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65  ar */.};..#ifnde
32d70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
32d80 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
32d90 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73  .** Append a mes
32da0 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f  sage to the erro
32db0 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
32dc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32dd0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32de0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
32df0 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a  pCheck,.  char *
32e00 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zMsg1,.  const c
32e10 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20  har *zFormat,.  
32e20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74  ....){.  va_list
32e30 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   ap;.  char *zMs
32e40 67 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  g2;.  if( !pChec
32e50 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
32e60 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
32e70 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
32e80 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
32e90 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
32ea0 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74  .  zMsg2 = sqlit
32eb0 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d  e3VMPrintf(zForm
32ec0 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
32ed0 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73  d(ap);.  if( zMs
32ee0 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20  g1==0 ) zMsg1 = 
32ef0 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  "";.  if( pCheck
32f00 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
32f10 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43   char *zOld = pC
32f20 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  heck->zErrMsg;. 
32f30 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d     pCheck->zErrM
32f40 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  sg = 0;.    sqli
32f50 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43  te3SetString(&pC
32f60 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a  heck->zErrMsg, z
32f70 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31  Old, "\n", zMsg1
32f80 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29  , zMsg2, (char*)
32f90 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
32fa0 65 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73  ee(zOld);.  }els
32fb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
32fc0 74 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d  tString(&pCheck-
32fd0 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c  >zErrMsg, zMsg1,
32fe0 20 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30   zMsg2, (char*)0
32ff0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
33000 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65  ree(zMsg2);.}.#e
33010 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
33020 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
33030 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
33040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
33050 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
33060 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72  * Add 1 to the r
33070 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
33080 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20  or page iPage.  
33090 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73  If this is the s
330a0 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e  econd.** referen
330b0 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20  ce to the page, 
330c0 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  add an error mes
330d0 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e  sage to pCheck->
330e0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75  zErrMsg..** Retu
330f0 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72  rn 1 if there ar
33100 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66  e 2 ore more ref
33110 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
33120 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20  age and 0 if.** 
33130 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
33140 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  irst reference t
33150 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  o the page..**.*
33160 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61  * Also check tha
33170 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
33180 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a  r is in bounds..
33190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
331a0 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79  eckRef(Integrity
331b0 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20  Ck *pCheck, int 
331c0 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
331d0 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
331e0 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
331f0 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
33200 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20  Check->nPage || 
33210 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63  iPage<0 ){.    c
33220 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
33230 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
33240 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75  "invalid page nu
33250 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29  mber %d", iPage)
33260 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
33270 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b    }.  if( pCheck
33280 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d  ->anRef[iPage]==
33290 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  1 ){.    checkAp
332a0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
332b0 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72  zContext, "2nd r
332c0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
332d0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
332e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
332f0 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
33300 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
33310 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  +)>1;.}..#ifndef
33320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33330 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68  OVACUUM./*.** Ch
33340 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74  eck that the ent
33350 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
33360 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69  r-map for page i
33370 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a  Child maps to .*
33380 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20  * page iParent, 
33390 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72  pointer type ptr
333a0 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70  Type. If not, ap
333b0 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65  pend an error me
333c0 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65  ssage.** to pChe
333d0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
333e0 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a  id checkPtrmap(.
333f0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
33400 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65  Check,   /* Inte
33410 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74  grity check cont
33420 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ext */.  Pgno iC
33430 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  hild,           
33440 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75  /* Child page nu
33450 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79  mber */.  u8 eTy
33460 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
33470 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
33480 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f  nter map type */
33490 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c  .  Pgno iParent,
334a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
334b0 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
334c0 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  p parent page nu
334d0 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
334e0 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
334f0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63   /* Context desc
33500 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f  ription (used fo
33510 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a  r error msg) */.
33520 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
33530 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20  8 ePtrmapType;. 
33540 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72   Pgno iPtrmapPar
33550 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72  ent;..  rc = ptr
33560 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  mapGet(pCheck->p
33570 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74  Bt, iChild, &ePt
33580 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d  rmapType, &iPtrm
33590 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  apParent);.  if(
335a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
335b0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
335c0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
335d0 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74  ntext, "Failed t
335e0 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65  o read ptrmap ke
335f0 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a  y=%d", iChild);.
33600 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
33610 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79  .  if( ePtrmapTy
33620 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74  pe!=eType || iPt
33630 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72  rmapParent!=iPar
33640 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ent ){.    check
33650 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33660 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
33670 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20     "Bad ptr map 
33680 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70  entry key=%d exp
33690 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f  ected=(%d,%d) go
336a0 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20  t=(%d,%d)", .   
336b0 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65     iChild, eType
336c0 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d  , iParent, ePtrm
336d0 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50  apType, iPtrmapP
336e0 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  arent);.  }.}.#e
336f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
33700 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
33710 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
33720 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  or of an overflo
33730 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20  w page list..** 
33740 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
33750 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
33760 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e  on the list is N
33770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33780 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e   checkList(.  In
33790 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
337a0 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  k,  /* Integrity
337b0 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78   checking contex
337c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65  t */.  int isFre
337d0 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eList,       /* 
337e0 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c  True for a freel
337f0 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ist.  False for 
33800 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
33810 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  st */.  int iPag
33820 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
33830 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
33840 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74   first page in t
33850 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
33860 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
33870 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
33880 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
33890 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
338a0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
338b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
338c0 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
338d0 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ges */.){.  int 
338e0 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65  i;.  int expecte
338f0 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69  d = N;.  int iFi
33900 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77  rst = iPage;.  w
33910 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26  hile( N-- > 0 &&
33920 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29   pCheck->mxErr )
33930 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f  {.    DbPage *pO
33940 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73  vflPage;.    uns
33950 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66  igned char *pOvf
33960 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69  lData;.    if( i
33970 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20  Page<1 ){.      
33980 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
33990 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
339a0 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66  .         "%d of
339b0 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e   %d pages missin
339c0 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20  g from overflow 
339d0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
339e0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
339f0 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69  N+1, expected, i
33a00 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72  First);.      br
33a10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
33a20 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
33a30 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  ck, iPage, zCont
33a40 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ext) ) break;.  
33a50 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
33a60 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  erGet(pCheck->pP
33a70 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
33a80 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29  e, &pOvflPage) )
33a90 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
33aa0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
33ab0 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64  Context, "failed
33ac0 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22   to get page %d"
33ad0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
33ae0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
33af0 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e   pOvflData = (un
33b00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
33b10 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
33b20 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20  a(pOvflPage);.  
33b30 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74    if( isFreeList
33b40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
33b50 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
33b60 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64  lData[4]);.#ifnd
33b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33b80 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
33b90 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
33ba0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
33bb0 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
33bc0 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ap(pCheck, iPage
33bd0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
33be0 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
33bf0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
33c00 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65        if( n>pChe
33c10 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ck->pBt->usableS
33c20 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20 20  ize/4-8 ){.     
33c30 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33c40 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
33c50 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  xt,.           "
33c60 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f  freelist leaf co
33c70 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70  unt too big on p
33c80 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
33c90 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20  .        N--;.  
33ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33cb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
33cc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
33cd0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20   Pgno iFreePage 
33ce0 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
33cf0 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23  lData[8+i*4]);.#
33d00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33d10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
33d20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65          if( pChe
33d30 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
33d40 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
33d50 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
33d60 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
33d70 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
33d80 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
33d90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
33da0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68  dif.          ch
33db0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
33dc0 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65  FreePage, zConte
33dd0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
33de0 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20         N -= n;. 
33df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
33e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33e10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33e20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
33e30 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
33e40 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
33e50 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69  cuum and iPage i
33e60 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20  s not the last. 
33e70 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
33e80 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69  this overflow li
33e90 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  st, check that t
33ea0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
33eb0 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  ntry for.      *
33ec0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
33ed0 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61  page matches iPa
33ee0 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
33ef0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
33f00 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
33f10 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & N>0 ){.       
33f20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f   i = get4byte(pO
33f30 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20  vflData);.      
33f40 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
33f50 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f  heck, i, PTRMAP_
33f60 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65  OVERFLOW2, iPage
33f70 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
33f80 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
33f90 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65  f.    iPage = ge
33fa0 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61  t4byte(pOvflData
33fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
33fc0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61  gerUnref(pOvflPa
33fd0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ge);.  }.}.#endi
33fe0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
33ff0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
34000 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
34010 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
34020 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
34030 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
34040 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
34050 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
34060 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
34070 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
34080 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
34090 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
340a0 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
340b0 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
340c0 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
340d0 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
340e0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
340f0 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
34100 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
34110 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
34120 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
34130 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
34140 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
34150 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
34160 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
34170 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
34180 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
34190 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
341a0 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
341b0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
341c0 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
341d0 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
341e0 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
341f0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
34200 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
34210 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
34220 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
34230 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
34240 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
34250 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
34260 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
34270 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
34280 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
34290 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
342a0 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
342b0 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
342c0 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
342d0 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
342e0 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
342f0 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
34300 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
34310 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
34320 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
34330 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
34340 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
34350 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
34360 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
34370 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
34380 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
34390 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
343a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
343b0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
343c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
343d0 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
343e0 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
343f0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20  zParentContext  
34400 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
34410 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  t */.){.  MemPag
34420 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
34430 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32  i, rc, depth, d2
34440 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69  , pgno, cnt;.  i
34450 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72  nt hdr, cellStar
34460 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  t;.  int nCell;.
34470 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74    u8 *data;.  Bt
34480 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69  Shared *pBt;.  i
34490 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
344a0 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31   char zContext[1
344b0 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74  00];.  char *hit
344c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
344d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
344e0 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
344f0 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69  , "Page %d: ", i
34500 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  Page);..  /* Che
34510 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
34520 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70   exists.  */.  p
34530 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74  Bt = pCheck->pBt
34540 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
34550 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34560 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  ;.  if( iPage==0
34570 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
34580 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
34590 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65  ck, iPage, zPare
345a0 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74  ntContext) ) ret
345b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63  urn 0;.  if( (rc
345c0 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
345d0 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50  (Pgno)iPage, &pP
345e0 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  age, 0))!=0 ){. 
345f0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34600 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
34610 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e 61 62  xt,.       "unab
34620 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 70 61  le to get the pa
34630 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  ge. error code=%
34640 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 74  d", rc);.    ret
34650 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
34660 20 28 72 63 20 3d 20 69 6e 69 74 50 61 67 65 28   (rc = initPage(
34670 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29  pPage, pParent))
34680 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
34690 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
346a0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 69  , zContext, "ini
346b0 74 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20  tPage() returns 
346c0 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20  error code %d", 
346d0 72 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  rc);.    release
346e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
346f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
34700 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61    /* Check out a
34710 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20  ll the cells..  
34720 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a  */.  depth = 0;.
34730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
34740 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68  ge->nCell && pCh
34750 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29  eck->mxErr; i++)
34760 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  {.    u8 *pCell;
34770 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20  .    int sz;.   
34780 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
34790 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61  .    /* Check pa
347a0 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70  yload overflow p
347b0 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ages.    */.    
347c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
347d0 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
347e0 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  ), zContext,.   
347f0 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72            "On tr
34800 65 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20  ee page %d cell 
34810 25 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29  %d: ", iPage, i)
34820 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
34830 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b  ndCell(pPage,i);
34840 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74  .    parseCellPt
34850 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
34860 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
34870 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
34880 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
34890 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f  Key ) sz += info
348a0 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72  .nKey;.    asser
348b0 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79  t( sz==info.nPay
348c0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20  load );.    if( 
348d0 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  sz>info.nLocal )
348e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
348f0 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e  e = (sz - info.n
34900 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69  Local + usableSi
34910 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53  ze - 5)/(usableS
34920 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ize - 4);.      
34930 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
34940 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
34950 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
34960 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
34970 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
34980 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
34990 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
349a0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
349b0 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76  p(pCheck, pgnoOv
349c0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
349d0 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW1, iPage, zCo
349e0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
349f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65  #endif.      che
34a00 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30  ckList(pCheck, 0
34a10 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67  , pgnoOvfl, nPag
34a20 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
34a30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
34a40 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74  k sanity of left
34a50 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
34a60 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
34a70 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
34a80 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
34a90 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  e(pCell);.#ifnde
34aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34ab0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
34ac0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34ad0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
34ae0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
34af0 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
34b00 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f  TREE, iPage, zCo
34b10 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
34b20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20  #endif.      d2 
34b30 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  = checkTreePage(
34b40 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67  pCheck,pgno,pPag
34b50 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e,zContext);.   
34b60 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
34b70 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
34b80 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34b90 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
34ba0 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
34bb0 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
34bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
34bd0 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
34be0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
34bf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
34c00 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
34c10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
34c20 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
34c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
34c40 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
34c50 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
34c60 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
34c70 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61            "On pa
34c80 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
34c90 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
34ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34cb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34cc0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
34cd0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
34ce0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
34cf0 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
34d00 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
34d10 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
34d20 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
34d30 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
34d40 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   pPage, zContext
34d50 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68  );.  }. .  /* Ch
34d60 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65  eck for complete
34d70 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65   coverage of the
34d80 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74   page.  */.  dat
34d90 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
34da0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
34db0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69  >hdrOffset;.  hi
34dc0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
34dd0 28 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ( usableSize );.
34de0 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20    if( hit ){.   
34df0 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20   memset(hit, 1, 
34e00 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
34e10 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65  dr+5]));.    nCe
34e20 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
34e30 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
34e40 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72   cellStart = hdr
34e50 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
34e60 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69  >leaf;.    for(i
34e70 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
34e80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20  ){.      int pc 
34e90 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
34ea0 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29  [cellStart+i*2])
34eb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  ;.      int size
34ec0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
34ed0 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
34ee0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
34ef0 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
34f00 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
34f10 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
34f20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34f30 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
34f40 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
34f50 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
34f60 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
34f70 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
34f80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34f90 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
34fa0 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
34fb0 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
34fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34fd0 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
34fe0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
34ff0 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
35000 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
35010 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
35020 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
35030 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
35040 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
35050 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
35060 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
35070 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
35080 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
35090 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
350a0 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
350b0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
350c0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
350d0 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
350e0 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
350f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35100 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
35110 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
35120 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
35130 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
35140 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
35150 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
35160 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
35170 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
35180 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
35190 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
351a0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
351b0 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
351c0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
351d0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
351e0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
351f0 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
35200 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
35210 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
35220 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35240 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
35250 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
35260 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
35270 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
35280 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
35290 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
352a0 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
352b0 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
352c0 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
352d0 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
352e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
352f0 74 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  teFree(hit);..  
35300 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35310 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
35320 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
35330 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
35340 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
35350 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
35360 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
35370 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
35380 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
35390 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
353a0 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
353b0 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
353c0 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
353d0 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
353e0 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
353f0 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
35400 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
35410 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
35420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
35430 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
35440 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
35450 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c  hing checks out,
35460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
35470 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20  turns NULL.  If 
35480 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20  something is.** 
35490 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20  amiss, an error 
354a0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
354b0 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
354c0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
354d0 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70  loc().** and a p
354e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65  ointer to that e
354f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
35500 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
35510 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
35520 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
35530 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
35540 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
35550 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
35560 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
35570 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
35580 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
35590 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
355a0 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
355b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
355c0 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
355d0 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
355e0 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
355f0 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
35600 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
35610 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
35620 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
35630 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
35640 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
35650 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
35660 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
35670 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
35680 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
35690 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
356a0 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
356b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
356c0 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
356d0 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
356e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
356f0 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52 65 66 20  p->pBt;..  nRef 
35700 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
35710 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
35720 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42  er);.  if( lockB
35730 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
35740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35750 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
35760 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65 20 74  StrDup("Unable t
35770 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
35780 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
35790 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73  abase");.  }.  s
357a0 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b  Check.pBt = pBt;
357b0 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65 72  .  sCheck.pPager
357c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
357d0 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
357e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
357f0 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50  ecount(sCheck.pP
35800 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e  ager);.  sCheck.
35810 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20  mxErr = mxErr;. 
35820 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30   sCheck.nErr = 0
35830 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a  ;.  *pnErr = 0;.
35840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35850 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35860 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
35870 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63  !=0 ){.    sChec
35880 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e  k.nPage = pBt->n
35890 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  Trunc;.  }.#endi
358a0 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  f.  if( sCheck.n
358b0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
358c0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
358d0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 72 65 74  ed(pBt);.    ret
358e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68  urn 0;.  }.  sCh
358f0 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69  eck.anRef = sqli
35900 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 28 73 43  teMallocRaw( (sC
35910 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
35920 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
35930 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
35940 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
35950 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
35960 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
35970 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
35980 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
35990 4d 50 72 69 6e 74 66 28 22 55 6e 61 62 6c 65 20  MPrintf("Unable 
359a0 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62 79 74  to malloc %d byt
359b0 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 28 73  es", .        (s
359c0 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
359d0 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
359e0 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 66  ef[0]));.  }.  f
359f0 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63  or(i=0; i<=sChec
35a00 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73  k.nPage; i++){ s
35a10 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d  Check.anRef[i] =
35a20 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44   0; }.  i = PEND
35a30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35a40 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73 43 68  t);.  if( i<=sCh
35a50 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20  eck.nPage ){.   
35a60 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
35a70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43 68 65   = 1;.  }.  sChe
35a80 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  ck.zErrMsg = 0;.
35a90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
35aa0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
35ab0 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
35ac0 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
35ad0 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
35ae0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
35af0 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
35b00 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
35b10 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
35b20 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
35b30 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
35b40 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
35b50 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
35b60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
35b70 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
35b80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
35b90 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
35ba0 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
35bb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35bc0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
35bd0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
35be0 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
35bf0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
35c00 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
35c10 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
35c20 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
35c30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
35c40 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
35c50 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
35c60 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
35c70 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
35c80 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
35c90 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
35ca0 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
35cb0 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
35cc0 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
35cd0 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  age && sCheck.mx
35ce0 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  Err; i++){.#ifde
35cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35d00 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
35d10 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
35d20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
35d30 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
35d40 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
35d50 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
35d60 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
35d70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
35d80 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
35d90 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
35da0 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
35db0 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
35dc0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
35dd0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
35de0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35df0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
35e00 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
35e10 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
35e20 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
35e30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
35e40 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
35e50 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
35e60 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
35e70 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
35e80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
35e90 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
35ea0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
35eb0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
35ec0 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
35ed0 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
35ee0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
35ef0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
35f00 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
35f10 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
35f20 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
35f30 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
35f40 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
35f50 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
35f60 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
35f70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
35f80 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
35f90 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
35fa0 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   != sqlite3Pager
35fb0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
35fc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65  ager) ){.    che
35fd0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
35fe0 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22  eck, 0, .      "
35ff0 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  Outstanding page
36000 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d   count goes from
36010 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67   %d to %d during
36020 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c   this analysis",
36030 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c  .      nRef, sql
36040 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
36050 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  t(pBt->pPager). 
36060 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
36070 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
36080 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
36090 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73  /.  sqliteFree(s
360a0 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
360b0 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
360c0 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  nErr;.  return s
360d0 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d  Check.zErrMsg;.}
360e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
360f0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
36100 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
36110 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
36120 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
36130 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
36140 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
36150 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
36160 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
36170 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
36180 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
36190 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
361a0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
361b0 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
361c0 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
361d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
361e0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
361f0 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
36200 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
36210 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
36220 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
36230 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
36240 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
36250 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
36260 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
36270 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
36280 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
36290 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
362a0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
362b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
362c0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
362d0 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
362e0 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
362f0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
36300 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
36310 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
36320 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
36330 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
36340 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
36350 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
36360 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
36370 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
36380 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
36390 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
363a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
363b0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
363c0 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
363d0 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  er);.}..#ifndef 
363e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
363f0 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
36400 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
36410 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
36420 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
36430 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
36440 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
36450 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
36460 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
36470 65 20 70 42 74 46 72 6f 6d 20 6d 61 79 20 62 65  e pBtFrom may be
36480 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69 73   reduced by this
36490 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   operation..** I
364a0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
364b0 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73  wrong, the trans
364c0 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f  action on pBtFro
364d0 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  m is rolled back
364e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
364f0 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  BtreeCopyFile(Bt
36500 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
36510 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
36520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36530 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20   Pgno i, nPage, 
36540 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a  nToPage, iSkip;.
36550 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
36560 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
36570 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
36580 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
36590 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54  ..  if( pTo->inT
365a0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
365b0 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72  E || pFrom->inTr
365c0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
365d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
365e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
365f0 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43  .  if( pBtTo->pC
36600 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 53  ursor ) return S
36610 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 6e 54  QLITE_BUSY;.  nT
36620 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
36630 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
36640 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
36650 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  nPage = sqlite3P
36660 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
36670 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
36680 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
36690 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
366a0 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  o);.  for(i=1; r
366b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
366c0 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
366d0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
366e0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
366f0 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
36700 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
36710 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
36720 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  om->pPager, i, &
36730 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
36740 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
36750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36760 67 65 72 4f 76 65 72 77 72 69 74 65 28 70 42 74  gerOverwrite(pBt
36770 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 73  To->pPager, i, s
36780 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
36790 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a 20 20  ta(pDbPage));.  
367a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
367b0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
367c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  }..  /* If the f
367d0 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69 6e 67  ile is shrinking
367e0 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20 70 61  , journal the pa
367f0 67 65 73 20 74 68 61 74 20 61 72 65 20 62 65 69  ges that are bei
36800 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20 20 2a  ng truncated.  *
36810 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  * so that they c
36820 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
36830 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  k if the commit 
36840 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  fails..  */.  fo
36850 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72 63 3d  r(i=nPage+1; rc=
36860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
36870 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  =nToPage; i++){.
36880 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
36890 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  age;.    if( i==
368a0 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e 75 65  iSkip ) continue
368b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
368c0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f  e3PagerGet(pBtTo
368d0 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44  ->pPager, i, &pD
368e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
368f0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
36900 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36910 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
36920 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
36930 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61  rDontWrite(pDbPa
36940 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65 61 68  ge);.    /* Yeah
36950 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72  .  It seems wier
36960 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72  d to call DontWr
36970 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65  ite() right afte
36980 72 20 57 72 69 74 65 28 29 2e 20 20 42 75 74 0a  r Write().  But.
36990 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62      ** that is b
369a0 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73  ecause the names
369b0 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64   of those proced
369c0 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63  ures do not exac
369d0 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65 70 72  tly .    ** repr
369e0 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20  esent what they 
369f0 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61  do.  Write() rea
36a00 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74  lly means "put t
36a10 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a  his page in the.
36a20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
36a30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
36a40 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
36a50 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
36a60 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 74  written.    ** t
36a70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
36a80 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e  ile later."  Don
36a90 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20  tWrite() undoes 
36aa0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20  the second part 
36ab0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 61  of.    ** that a
36ac0 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  nd prevents the 
36ad0 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20  page from being 
36ae0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
36af0 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a 20 20  atabase.  The.  
36b00 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69    ** page is sti
36b10 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ll on the rollba
36b20 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75  ck journal, thou
36b30 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73  gh.  And that is
36b40 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20 20 2a   the whole.    *
36b50 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20  * point of this 
36b60 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70 61 67  loop: to put pag
36b70 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  es on the rollba
36b80 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ck journal. */. 
36b90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36ba0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
36bb0 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26 26 20   }.  if( !rc && 
36bc0 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20 29 7b  nPage<nToPage ){
36bd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36be0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
36bf0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 6e 50  BtTo->pPager, nP
36c00 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
36c10 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
36c20 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
36c30 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
36c40 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65 6e 64 69  rn rc;  .}.#endi
36c50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
36c60 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _VACUUM */../*.*
36c70 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
36c80 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  o if a transacti
36c90 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
36ca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36cb0 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65  eIsInTrans(Btree
36cc0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *p){.  return (
36cd0 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
36ce0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
36cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36d00 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
36d10 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
36d20 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
36d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
36d40 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
36d50 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
36d60 28 70 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42  (p->pBt && p->pB
36d70 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  t->inStmt);.}../
36d80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
36d90 7a 65 72 6f 20 69 66 20 61 20 72 65 61 64 20 28  zero if a read (
36da0 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
36db0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
36dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
36dd0 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
36de0 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  s(Btree *p){.  r
36df0 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
36e00 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
36e10 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ONE));.}../*.** 
36e20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
36e30 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
36e40 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d 65 6d  to a blob of mem
36e50 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
36e60 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ith.** a single 
36e70 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20 54 68  shared-btree. Th
36e80 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
36e90 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64 65 20   by client code 
36ea0 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a 2a 2a 20  for it's own.** 
36eb0 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65 78  purposes (for ex
36ec0 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65 20  ample, to store 
36ed0 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63 68  a high-level sch
36ee0 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ema associated w
36ef0 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61 72  ith .** the shar
36f00 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20 62  ed-btree). The b
36f10 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61 67  tree layer manag
36f20 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  es reference cou
36f30 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a 2a  nting issues..**
36f40 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
36f50 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  me this is calle
36f60 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62 74  d on a shared-bt
36f70 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74 65  ree, nBytes byte
36f80 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  s of memory.** a
36f90 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a 65  re allocated, ze
36fa0 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72 6e  roed, and return
36fb0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
36fc0 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73 65  . For each subse
36fd0 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20 74  quent .** call t
36fe0 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d 65  he nBytes parame
36ff0 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 61  ter is ignored a
37000 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
37010 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a 2a  the same blob.**
37020 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75 72   of memory retur
37030 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a 75 73 74  ned. .**.** Just
37040 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61 72   before the shar
37050 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73  ed-btree is clos
37060 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
37070 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
37080 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e  ** xFree argumen
37090 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72  t when the memor
370a0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73  y allocation was
370b0 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64   made is invoked
370c0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62   on the .** blob
370d0 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65   of allocated me
370e0 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74  mory. This funct
370f0 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ion should not c
37100 61 6c 6c 20 73 71 6c 69 74 65 46 72 65 65 28 29  all sqliteFree()
37110 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72  .** on the memor
37120 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  y, the btree lay
37130 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f  er does that..*/
37140 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74  .void *sqlite3Bt
37150 72 65 65 53 63 68 65 6d 61 28 42 74 72 65 65 20  reeSchema(Btree 
37160 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c 20  *p, int nBytes, 
37170 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76 6f 69  void(*xFree)(voi
37180 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61 72 65  d *)){.  BtShare
37190 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
371a0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63  .  if( !pBt->pSc
371b0 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
371c0 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
371d0 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b  eMalloc(nBytes);
371e0 0a 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53  .    pBt->xFreeS
371f0 63 68 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20  chema = xFree;. 
37200 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d   }.  return pBt-
37210 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a  >pSchema;.}../*.
37220 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
37230 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f  f another user o
37240 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72 65  f the same share
37250 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20 61  d btree as the a
37260 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c  rgument.** handl
37270 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  e holds an exclu
37280 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
37290 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
372a0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
372b0 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c  ite3BtreeSchemaL
372c0 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b  ocked(Btree *p){
372d0 0a 20 20 72 65 74 75 72 6e 20 28 71 75 65 72 79  .  return (query
372e0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
372f0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
37300 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  OCK)!=SQLITE_OK)
37310 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
37320 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
37330 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
37340 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
37350 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
37360 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
37370 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
37380 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
37390 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
373a0 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
373b0 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
373c0 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
373d0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
373e0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
373f0 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
37400 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
37410 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37420 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28   u8 lockType = (
37430 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54  isWriteLock?WRIT
37440 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b  E_LOCK:READ_LOCK
37450 29 3b 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54  );.  rc = queryT
37460 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
37470 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 69  , lockType);.  i
37480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63   ){.    rc = loc
374a0 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62 2c 20  kTable(p, iTab, 
374b0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 7d 0a 20  lockType);.  }. 
374c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
374d0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
374e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
374f0 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
37500 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
37510 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
37520 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
37530 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
37540 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
37550 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
37560 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
37570 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
37580 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
37590 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
375a0 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
375b0 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
375c0 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
375d0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
375e0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
375f0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
37600 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
37610 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
37620 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
37630 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
37640 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
37650 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
37660 64 20 2a 7a 29 7b 0a 20 20 42 74 53 68 61 72 65  d *z){.  BtShare
37670 64 20 2a 70 42 74 20 3d 20 70 43 73 72 2d 3e 70  d *pBt = pCsr->p
37680 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20 20 61  Btree->pBt;..  a
37690 73 73 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e  ssert(pCsr->isIn
376a0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20  crblobHandle);. 
376b0 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74   if( pCsr->eStat
376c0 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
376d0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 72 65 74  ESEEK ){.    ret
376e0 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
376f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
37700 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74  k some precondit
37710 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61  ions: .  **   (a
37720 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  ) the cursor is 
37730 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
37740 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65  ,.  **   (b) the
37750 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f  re is no read-lo
37760 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
37770 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61  being modified a
37780 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68  nd.  **   (c) th
37790 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
377a0 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f  at a valid row o
377b0 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  f an intKey tabl
377c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
377d0 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Csr->wrFlag ){. 
377e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
377f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
37800 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
37810 65 61 64 4f 6e 6c 79 20 26 26 20 70 42 74 2d 3e  eadOnly && pBt->
37820 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
37830 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
37840 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
37850 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c  ks(pCsr->pBtree,
37860 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCsr->pgnoRoot,
37870 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20 72 65   pCsr) ){.    re
37880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
37890 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
378a0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
378b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
378c0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73  */.  }.  if( pCs
378d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
378e0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43  R_INVALID || !pC
378f0 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  sr->pPage->intKe
37900 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
37910 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
37920 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  }..  return acce
37930 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20  ssPayload(pCsr, 
37940 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
37950 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c  signed char *)z,
37960 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a   0, 1);.}../* .*
37970 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20  * Set a flag on 
37980 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63  this cursor to c
37990 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  ache the locatio
379a0 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d  ns of pages from
379b0 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f   the .** overflo
379c0 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63  w list for the c
379d0 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73  urrent row. This
379e0 20 69 73 20 75 73 65 64 20 62 79 20 63 75 72 73   is used by curs
379f0 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f  ors opened.** fo
37a00 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  r incremental bl
37a10 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a  ob IO only..**.*
37a20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37a30 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79  sets a flag only
37a40 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 61 67  . The actual pag
37a50 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63 68 65  e location cache
37a60 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e 20 42  .** (stored in B
37a70 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
37a80 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61 74 65  w[]) is allocate
37a90 64 20 61 6e 64 20 75 73 65 64 20 62 79 20 66 75  d and used by fu
37aa0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73  nction.** access
37ab0 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65 20 77  Payload() (the w
37ac0 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  orker function f
37ad0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
37ae0 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  ata() and.** sql
37af0 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61  ite3BtreePutData
37b00 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ())..*/.void sql
37b10 69 74 65 33 42 74 72 65 65 43 61 63 68 65 4f 76  ite3BtreeCacheOv
37b20 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f 72 20  erflow(BtCursor 
37b30 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
37b40 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  (!pCur->isIncrbl
37b50 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73  obHandle);.  ass
37b60 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
37b70 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69  flow);.  pCur->i
37b80 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
37b90 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 1;.}.#endif../
37ba0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
37bb0 6e 67 20 64 65 62 75 67 67 69 6e 67 20 69 6e 74  ng debugging int
37bc0 65 72 66 61 63 65 20 68 61 73 20 74 6f 20 62 65  erface has to be
37bd0 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 72   in this file (r
37be0 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 69 6e  ather.** than in
37bf0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
37c00 65 73 74 31 2e 63 29 20 73 6f 20 74 68 61 74 20  est1.c) so that 
37c10 69 74 20 63 61 6e 20 67 65 74 20 61 63 63 65 73  it can get acces
37c20 73 20 74 6f 0a 2a 2a 20 74 68 65 20 64 65 66 69  s to.** the defi
37c30 6e 69 74 69 6f 6e 20 6f 66 20 42 74 53 68 61 72  nition of BtShar
37c40 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ed..*/.#if defin
37c50 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
37c60 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 53   && defined(TCLS
37c70 48 29 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c  H).#include <tcl
37c80 2e 68 3e 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .h>.int sqlite3_
37c90 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70  shared_cache_rep
37ca0 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ort(.  void * cl
37cb0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
37cc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
37cd0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
37ce0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
37cf0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
37d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
37d10 44 5f 43 41 43 48 45 0a 20 20 63 6f 6e 73 74 20  D_CACHE.  const 
37d20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 64 20  ThreadData *pTd 
37d30 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
37d40 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
37d50 20 69 66 28 20 70 54 64 2d 3e 75 73 65 53 68 61   if( pTd->useSha
37d60 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20 20 42  redData ){.    B
37d70 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20  tShared *pBt;.  
37d80 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
37d90 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
37da0 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 64 2d      for(pBt=pTd-
37db0 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70 42  >pBtree; pBt; pB
37dc0 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
37dd0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
37de0 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
37df0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
37e00 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
37e10 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
37e20 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
37e30 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
37e40 53 74 72 69 6e 67 4f 62 6a 28 7a 46 69 6c 65 2c  StringObj(zFile,
37e50 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 54 63 6c   -1));.      Tcl
37e60 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
37e70 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
37e80 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
37e90 6a 28 70 42 74 2d 3e 6e 52 65 66 29 29 3b 0a 20  j(pBt->nRef));. 
37ea0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74     }.    Tcl_Set
37eb0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
37ec0 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e  , pRet);.  }.#en
37ed0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
37ee0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a        _OK;.}.#endif.