/ Hex Artifact Content
Login

Artifact 0b2c181ea3ee23b5daef6f89d07a8a60d0f6370f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 36 35 20 32 30 30 37 2f 30  c,v 1.365 2007/0
0190: 35 2f 30 32 20 31 33 3a 31 36 3a 33 30 20 64 61  5/02 13:16:30 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 46 6f 72  g BTrees..** For
0200: 20 61 20 64 65 74 61 69 6c 65 64 20 64 69 73 63   a detailed disc
0210: 75 73 73 69 6f 6e 20 6f 66 20 42 54 72 65 65 73  ussion of BTrees
0220: 2c 20 72 65 66 65 72 20 74 6f 0a 2a 2a 0a 2a 2a  , refer to.**.**
0230: 20 20 20 20 20 44 6f 6e 61 6c 64 20 45 2e 20 4b       Donald E. K
0240: 6e 75 74 68 2c 20 54 48 45 20 41 52 54 20 4f 46  nuth, THE ART OF
0250: 20 43 4f 4d 50 55 54 45 52 20 50 52 4f 47 52 41   COMPUTER PROGRA
0260: 4d 4d 49 4e 47 2c 20 56 6f 6c 75 6d 65 20 33 3a  MMING, Volume 3:
0270: 0a 2a 2a 20 20 20 20 20 22 53 6f 72 74 69 6e 67  .**     "Sorting
0280: 20 41 6e 64 20 53 65 61 72 63 68 69 6e 67 22 2c   And Searching",
0290: 20 70 61 67 65 73 20 34 37 33 2d 34 38 30 2e 20   pages 473-480. 
02a0: 41 64 64 69 73 6f 6e 2d 57 65 73 6c 65 79 0a 2a  Addison-Wesley.*
02b0: 2a 20 20 20 20 20 50 75 62 6c 69 73 68 69 6e 67  *     Publishing
02c0: 20 43 6f 6d 70 61 6e 79 2c 20 52 65 61 64 69 6e   Company, Readin
02d0: 67 2c 20 4d 61 73 73 61 63 68 75 73 65 74 74 73  g, Massachusetts
02e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
02f0: 63 20 69 64 65 61 20 69 73 20 74 68 61 74 20 65  c idea is that e
0300: 61 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20  ach page of the 
0310: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 4e 20  file contains N 
0320: 64 61 74 61 62 61 73 65 0a 2a 2a 20 65 6e 74 72  database.** entr
0330: 69 65 73 20 61 6e 64 20 4e 2b 31 20 70 6f 69 6e  ies and N+1 poin
0340: 74 65 72 73 20 74 6f 20 73 75 62 70 61 67 65 73  ters to subpages
0350: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  ..**.**   ------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
03a0: 7c 20 20 50 74 72 28 30 29 20 7c 20 4b 65 79 28  |  Ptr(0) | Key(
03b0: 30 29 20 7c 20 50 74 72 28 31 29 20 7c 20 4b 65  0) | Ptr(1) | Ke
03c0: 79 28 31 29 20 7c 20 2e 2e 2e 20 7c 20 4b 65 79  y(1) | ... | Key
03d0: 28 4e 2d 31 29 20 7c 20 50 74 72 28 4e 29 20 7c  (N-1) | Ptr(N) |
03e0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
03f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 41 6c 6c  ------.**.** All
0430: 20 6f 66 20 74 68 65 20 6b 65 79 73 20 6f 6e 20   of the keys on 
0440: 74 68 65 20 70 61 67 65 20 74 68 61 74 20 50 74  the page that Pt
0450: 72 28 30 29 20 70 6f 69 6e 74 73 20 74 6f 20 68  r(0) points to h
0460: 61 76 65 20 76 61 6c 75 65 73 20 6c 65 73 73 0a  ave values less.
0470: 2a 2a 20 74 68 61 6e 20 4b 65 79 28 30 29 2e 20  ** than Key(0). 
0480: 20 41 6c 6c 20 6f 66 20 74 68 65 20 6b 65 79 73   All of the keys
0490: 20 6f 6e 20 70 61 67 65 20 50 74 72 28 31 29 20   on page Ptr(1) 
04a0: 61 6e 64 20 69 74 73 20 73 75 62 70 61 67 65 73  and its subpages
04b0: 20 68 61 76 65 0a 2a 2a 20 76 61 6c 75 65 73 20   have.** values 
04c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 4b 65 79  greater than Key
04d0: 28 30 29 20 61 6e 64 20 6c 65 73 73 20 74 68 61  (0) and less tha
04e0: 6e 20 4b 65 79 28 31 29 2e 20 20 41 6c 6c 20 6f  n Key(1).  All o
04f0: 66 20 74 68 65 20 6b 65 79 73 0a 2a 2a 20 6f 6e  f the keys.** on
0500: 20 50 74 72 28 4e 29 20 61 6e 64 20 69 74 73 20   Ptr(N) and its 
0510: 73 75 62 70 61 67 65 73 20 68 61 76 65 20 76 61  subpages have va
0520: 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68 61  lues greater tha
0530: 6e 20 4b 65 79 28 4e 2d 31 29 2e 20 20 41 6e 64  n Key(N-1).  And
0540: 0a 2a 2a 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  .** so forth..**
0550: 0a 2a 2a 20 46 69 6e 64 69 6e 67 20 61 20 70 61  .** Finding a pa
0560: 72 74 69 63 75 6c 61 72 20 6b 65 79 20 72 65 71  rticular key req
0570: 75 69 72 65 73 20 72 65 61 64 69 6e 67 20 4f 28  uires reading O(
0580: 6c 6f 67 28 4d 29 29 20 70 61 67 65 73 20 66 72  log(M)) pages fr
0590: 6f 6d 20 74 68 65 20 0a 2a 2a 20 64 69 73 6b 20  om the .** disk 
05a0: 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e  where M is the n
05b0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
05c0: 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
05d0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 69 6d 70 6c  .** In this impl
05e0: 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 61 20 73 69  ementation, a si
05f0: 6e 67 6c 65 20 66 69 6c 65 20 63 61 6e 20 68 6f  ngle file can ho
0600: 6c 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ld one or more s
0610: 65 70 61 72 61 74 65 20 0a 2a 2a 20 42 54 72 65  eparate .** BTre
0620: 65 73 2e 20 20 45 61 63 68 20 42 54 72 65 65 20  es.  Each BTree 
0630: 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
0640: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 69 74   the index of it
0650: 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68  s root page.  Th
0660: 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
0670: 61 20 66 6f 72 20 61 6e 79 20 65 6e 74 72 79 20  a for any entry 
0680: 61 72 65 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20  are combined to 
0690: 66 6f 72 6d 20 74 68 65 20 22 70 61 79 6c 6f 61  form the "payloa
06a0: 64 22 2e 20 20 41 0a 2a 2a 20 66 69 78 65 64 20  d".  A.** fixed 
06b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
06c0: 64 20 63 61 6e 20 62 65 20 63 61 72 72 69 65 64  d can be carried
06d0: 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74 68 65   directly on the
06e0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67   database.** pag
06f0: 65 2e 20 20 49 66 20 74 68 65 20 70 61 79 6c 6f  e.  If the paylo
0700: 61 64 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ad is larger tha
0710: 6e 20 74 68 65 20 70 72 65 73 65 74 20 61 6d 6f  n the preset amo
0720: 75 6e 74 20 74 68 65 6e 20 73 75 72 70 6c 75 73  unt then surplus
0730: 0a 2a 2a 20 62 79 74 65 73 20 61 72 65 20 73 74  .** bytes are st
0740: 6f 72 65 64 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  ored on overflow
0750: 20 70 61 67 65 73 2e 20 20 54 68 65 20 70 61 79   pages.  The pay
0760: 6c 6f 61 64 20 66 6f 72 20 61 6e 20 65 6e 74 72  load for an entr
0770: 79 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 65  y.** and the pre
0780: 63 65 64 69 6e 67 20 70 6f 69 6e 74 65 72 20 61  ceding pointer a
0790: 72 65 20 63 6f 6d 62 69 6e 65 64 20 74 6f 20 66  re combined to f
07a0: 6f 72 6d 20 61 20 22 43 65 6c 6c 22 2e 20 20 45  orm a "Cell".  E
07b0: 61 63 68 20 0a 2a 2a 20 70 61 67 65 20 68 61 73  ach .** page has
07c0: 20 61 20 73 6d 61 6c 6c 20 68 65 61 64 65 72 20   a small header 
07d0: 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74  which contains t
07e0: 68 65 20 50 74 72 28 4e 29 20 70 6f 69 6e 74 65  he Ptr(N) pointe
07f0: 72 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 69  r and other.** i
0800: 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 75 63 68 20  nformation such 
0810: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 6b  as the size of k
0820: 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 0a  ey and data..**.
0830: 2a 2a 20 46 4f 52 4d 41 54 20 44 45 54 41 49 4c  ** FORMAT DETAIL
0840: 53 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  S.**.** The file
0850: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
0860: 20 70 61 67 65 73 2e 20 20 54 68 65 20 66 69 72   pages.  The fir
0870: 73 74 20 70 61 67 65 20 69 73 20 63 61 6c 6c 65  st page is calle
0880: 64 20 70 61 67 65 20 31 2c 0a 2a 2a 20 74 68 65  d page 1,.** the
0890: 20 73 65 63 6f 6e 64 20 69 73 20 70 61 67 65 20   second is page 
08a0: 32 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  2, and so forth.
08b0: 20 20 41 20 70 61 67 65 20 6e 75 6d 62 65 72 20    A page number 
08c0: 6f 66 20 7a 65 72 6f 20 69 6e 64 69 63 61 74 65  of zero indicate
08d0: 73 0a 2a 2a 20 22 6e 6f 20 73 75 63 68 20 70 61  s.** "no such pa
08e0: 67 65 22 2e 20 20 54 68 65 20 70 61 67 65 20 73  ge".  The page s
08f0: 69 7a 65 20 63 61 6e 20 62 65 20 61 6e 79 74 68  ize can be anyth
0900: 69 6e 67 20 62 65 74 77 65 65 6e 20 35 31 32 20  ing between 512 
0910: 61 6e 64 20 36 35 35 33 36 2e 0a 2a 2a 20 45 61  and 65536..** Ea
0920: 63 68 20 70 61 67 65 20 63 61 6e 20 62 65 20 65  ch page can be e
0930: 69 74 68 65 72 20 61 20 62 74 72 65 65 20 70 61  ither a btree pa
0940: 67 65 2c 20 61 20 66 72 65 65 6c 69 73 74 20 70  ge, a freelist p
0950: 61 67 65 20 6f 72 20 61 6e 20 6f 76 65 72 66 6c  age or an overfl
0960: 6f 77 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ow.** page..**.*
0970: 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 67 65  * The first page
0980: 20 69 73 20 61 6c 77 61 79 73 20 61 20 62 74 72   is always a btr
0990: 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 66 69  ee page.  The fi
09a0: 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f 66  rst 100 bytes of
09b0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 61   the first.** pa
09c0: 67 65 20 63 6f 6e 74 61 69 6e 20 61 20 73 70 65  ge contain a spe
09d0: 63 69 61 6c 20 68 65 61 64 65 72 20 28 74 68 65  cial header (the
09e0: 20 22 66 69 6c 65 20 68 65 61 64 65 72 22 29 20   "file header") 
09f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
0a00: 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20  he file..** The 
0a10: 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 66 69  format of the fi
0a20: 6c 65 20 68 65 61 64 65 72 20 69 73 20 61 73 20  le header is as 
0a30: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
0a40: 20 4f 46 46 53 45 54 20 20 20 53 49 5a 45 20 20   OFFSET   SIZE  
0a50: 20 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a    DESCRIPTION.**
0a60: 20 20 20 20 20 20 30 20 20 20 20 20 20 31 36 20        0      16 
0a70: 20 20 20 20 48 65 61 64 65 72 20 73 74 72 69 6e      Header strin
0a80: 67 3a 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61  g: "SQLite forma
0a90: 74 20 33 5c 30 30 30 22 0a 2a 2a 20 20 20 20 20  t 3\000".**     
0aa0: 31 36 20 20 20 20 20 20 20 32 20 20 20 20 20 50  16       2     P
0ab0: 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  age size in byte
0ac0: 73 2e 20 20 0a 2a 2a 20 20 20 20 20 31 38 20 20  s.  .**     18  
0ad0: 20 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20       1     File 
0ae0: 66 6f 72 6d 61 74 20 77 72 69 74 65 20 76 65 72  format write ver
0af0: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 31 39 20 20  sion.**     19  
0b00: 20 20 20 20 20 31 20 20 20 20 20 46 69 6c 65 20       1     File 
0b10: 66 6f 72 6d 61 74 20 72 65 61 64 20 76 65 72 73  format read vers
0b20: 69 6f 6e 0a 2a 2a 20 20 20 20 20 32 30 20 20 20  ion.**     20   
0b30: 20 20 20 20 31 20 20 20 20 20 42 79 74 65 73 20      1     Bytes 
0b40: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
0b50: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
0b60: 63 68 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 32  ch page.**     2
0b70: 31 20 20 20 20 20 20 20 31 20 20 20 20 20 4d 61  1       1     Ma
0b80: 78 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  x embedded paylo
0b90: 61 64 20 66 72 61 63 74 69 6f 6e 0a 2a 2a 20 20  ad fraction.**  
0ba0: 20 20 20 32 32 20 20 20 20 20 20 20 31 20 20 20     22       1   
0bb0: 20 20 4d 69 6e 20 65 6d 62 65 64 64 65 64 20 70    Min embedded p
0bc0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a  ayload fraction.
0bd0: 2a 2a 20 20 20 20 20 32 33 20 20 20 20 20 20 20  **     23       
0be0: 31 20 20 20 20 20 4d 69 6e 20 6c 65 61 66 20 70  1     Min leaf p
0bf0: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a  ayload fraction.
0c00: 2a 2a 20 20 20 20 20 32 34 20 20 20 20 20 20 20  **     24       
0c10: 34 20 20 20 20 20 46 69 6c 65 20 63 68 61 6e 67  4     File chang
0c20: 65 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 20 20 20  e counter.**    
0c30: 20 32 38 20 20 20 20 20 20 20 34 20 20 20 20 20   28       4     
0c40: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
0c50: 75 72 65 20 75 73 65 0a 2a 2a 20 20 20 20 20 33  ure use.**     3
0c60: 32 20 20 20 20 20 20 20 34 20 20 20 20 20 46 69  2       4     Fi
0c70: 72 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67  rst freelist pag
0c80: 65 0a 2a 2a 20 20 20 20 20 33 36 20 20 20 20 20  e.**     36     
0c90: 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f    4     Number o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73  f freelist pages
0cb0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
0cc0: 20 20 20 20 34 30 20 20 20 20 20 20 36 30 20 20      40      60  
0cd0: 20 20 20 31 35 20 34 2d 62 79 74 65 20 6d 65 74     15 4-byte met
0ce0: 61 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20  a values passed 
0cf0: 74 6f 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  to higher layers
0d00: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
0d10: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
0d20: 20 61 72 65 20 62 69 67 2d 65 6e 64 69 61 6e 20   are big-endian 
0d30: 28 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e  (most significan
0d40: 74 20 62 79 74 65 20 66 69 72 73 74 29 2e 0a 2a  t byte first)..*
0d50: 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 63 68  *.** The file ch
0d60: 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20  ange counter is 
0d70: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
0d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
0d90: 20 63 68 61 6e 67 65 64 20 6d 6f 72 65 0a 2a 2a   changed more.**
0da0: 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69   than once withi
0db0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e  n the same secon
0dc0: 64 2e 20 20 54 68 69 73 20 63 6f 75 6e 74 65 72  d.  This counter
0dd0: 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
0de0: 74 68 65 0a 2a 2a 20 6d 6f 64 69 66 69 63 61 74  the.** modificat
0df0: 69 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65 20  ion time of the 
0e00: 66 69 6c 65 2c 20 61 6c 6c 6f 77 73 20 6f 74 68  file, allows oth
0e10: 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20  er processes to 
0e20: 6b 6e 6f 77 0a 2a 2a 20 77 68 65 6e 20 74 68 65  know.** when the
0e30: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
0e40: 64 20 61 6e 64 20 74 68 75 73 20 77 68 65 6e 20  d and thus when 
0e50: 74 68 65 79 20 6e 65 65 64 20 74 6f 20 66 6c 75  they need to flu
0e60: 73 68 20 74 68 65 69 72 0a 2a 2a 20 63 61 63 68  sh their.** cach
0e70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
0e80: 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
0e90: 64 20 66 72 61 63 74 69 6f 6e 20 69 73 20 74 68  d fraction is th
0ea0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
0eb0: 74 6f 74 61 6c 20 75 73 61 62 6c 65 0a 2a 2a 20  total usable.** 
0ec0: 73 70 61 63 65 20 69 6e 20 61 20 70 61 67 65 20  space in a page 
0ed0: 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6e 73  that can be cons
0ee0: 75 6d 65 64 20 62 79 20 61 20 73 69 6e 67 6c 65  umed by a single
0ef0: 20 63 65 6c 6c 20 66 6f 72 20 73 74 61 6e 64 61   cell for standa
0f00: 72 64 0a 2a 2a 20 42 2d 74 72 65 65 20 28 6e 6f  rd.** B-tree (no
0f10: 6e 2d 4c 45 41 46 44 41 54 41 29 20 74 61 62 6c  n-LEAFDATA) tabl
0f20: 65 73 2e 20 20 41 20 76 61 6c 75 65 20 6f 66 20  es.  A value of 
0f30: 32 35 35 20 6d 65 61 6e 73 20 31 30 30 25 2e 20  255 means 100%. 
0f40: 20 54 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   The default.** 
0f50: 69 73 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  is to limit the 
0f60: 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  maximum cell siz
0f70: 65 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  e so that at lea
0f80: 73 74 20 34 20 63 65 6c 6c 73 20 77 69 6c 6c 20  st 4 cells will 
0f90: 66 69 74 0a 2a 2a 20 6f 6e 20 6f 6e 65 20 70 61  fit.** on one pa
0fa0: 67 65 2e 20 20 54 68 75 73 20 74 68 65 20 64 65  ge.  Thus the de
0fb0: 66 61 75 6c 74 20 6d 61 78 20 65 6d 62 65 64 64  fault max embedd
0fc0: 65 64 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  ed payload fract
0fd0: 69 6f 6e 20 69 73 20 36 34 2e 0a 2a 2a 0a 2a 2a  ion is 64..**.**
0fe0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
0ff0: 66 6f 72 20 61 20 63 65 6c 6c 20 69 73 20 6c 61  for a cell is la
1000: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  rger than the ma
1010: 78 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 6e 20  x payload, then 
1020: 65 78 74 72 61 0a 2a 2a 20 70 61 79 6c 6f 61 64  extra.** payload
1030: 20 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 6f   is spilled to o
1040: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
1050: 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1060: 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
1070: 65 64 2c 0a 2a 2a 20 61 73 20 6d 61 6e 79 20 62  ed,.** as many b
1080: 79 74 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ytes as possible
1090: 20 61 72 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20   are moved into 
10a0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
10b0: 65 73 20 77 69 74 68 6f 75 74 20 6c 65 74 74 69  es without letti
10c0: 6e 67 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 73  ng.** the cell s
10d0: 69 7a 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 74  ize drop below t
10e0: 68 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20  he min embedded 
10f0: 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 20  ..**.** The min 
1110: 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61  leaf payload fra
1120: 63 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 74 68  ction is like th
1130: 65 20 6d 69 6e 20 65 6d 62 65 64 64 65 64 20 70  e min embedded p
1140: 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 0a  ayload fraction.
1150: 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ** except that i
1160: 74 20 61 70 70 6c 69 65 73 20 74 6f 20 6c 65 61  t applies to lea
1170: 66 20 6e 6f 64 65 73 20 69 6e 20 61 20 4c 45 41  f nodes in a LEA
1180: 46 44 41 54 41 20 74 72 65 65 2e 20 20 54 68 65  FDATA tree.  The
1190: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 70 61 79 6c   maximum.** payl
11a0: 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 66 6f 72  oad fraction for
11b0: 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
11c0: 20 69 73 20 61 6c 77 61 79 73 20 31 30 30 25 20   is always 100% 
11d0: 28 6f 72 20 32 35 35 29 20 61 6e 64 20 69 74 0a  (or 255) and it.
11e0: 2a 2a 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ** not specified
11f0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1200: 2a 2a 0a 2a 2a 20 45 61 63 68 20 62 74 72 65 65  **.** Each btree
1210: 20 70 61 67 65 73 20 69 73 20 64 69 76 69 64 65   pages is divide
1220: 64 20 69 6e 74 6f 20 74 68 72 65 65 20 73 65 63  d into three sec
1230: 74 69 6f 6e 73 3a 20 20 54 68 65 20 68 65 61 64  tions:  The head
1240: 65 72 2c 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 20  er, the.** cell 
1250: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2c 20 61  pointer array, a
1260: 6e 64 20 74 68 65 20 63 65 6c 6c 20 61 72 65 61  nd the cell area
1270: 20 61 72 65 61 2e 20 20 50 61 67 65 20 31 20 61   area.  Page 1 a
1280: 6c 73 6f 20 68 61 73 20 61 20 31 30 30 2d 62 79  lso has a 100-by
1290: 74 65 0a 2a 2a 20 66 69 6c 65 20 68 65 61 64 65  te.** file heade
12a0: 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 62 65  r that occurs be
12b0: 66 6f 72 65 20 74 68 65 20 70 61 67 65 20 68 65  fore the page he
12c0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ader..**.**     
12d0: 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   |--------------
12e0: 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 66 69  --|.**      | fi
12f0: 6c 65 20 68 65 61 64 65 72 20 20 20 20 7c 20 20  le header    |  
1300: 20 31 30 30 20 62 79 74 65 73 2e 20 20 50 61 67   100 bytes.  Pag
1310: 65 20 31 20 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20  e 1 only..**    
1320: 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    |-------------
1330: 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 70  ---|.**      | p
1340: 61 67 65 20 68 65 61 64 65 72 20 20 20 20 7c 20  age header    | 
1350: 20 20 38 20 62 79 74 65 73 20 66 6f 72 20 6c 65    8 bytes for le
1360: 61 76 65 73 2e 20 20 31 32 20 62 79 74 65 73 20  aves.  12 bytes 
1370: 66 6f 72 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  for interior nod
1380: 65 73 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d 2d  es.**      |----
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a  ------------|.**
13a0: 20 20 20 20 20 20 7c 20 63 65 6c 6c 20 70 6f 69        | cell poi
13b0: 6e 74 65 72 20 20 20 7c 20 20 20 7c 20 20 32 20  nter   |   |  2 
13c0: 62 79 74 65 73 20 70 65 72 20 63 65 6c 6c 2e 20  bytes per cell. 
13d0: 20 53 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a   Sorted order..*
13e0: 2a 20 20 20 20 20 20 7c 20 61 72 72 61 79 20 20  *      | array  
13f0: 20 20 20 20 20 20 20 20 7c 20 20 20 7c 20 20 47          |   |  G
1400: 72 6f 77 73 20 64 6f 77 6e 77 61 72 64 0a 2a 2a  rows downward.**
1410: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1420: 20 20 20 20 20 20 20 7c 20 20 20 76 0a 2a 2a 20         |   v.** 
1430: 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       |----------
1440: 2d 2d 2d 2d 2d 2d 7c 0a 2a 2a 20 20 20 20 20 20  ------|.**      
1450: 7c 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 20 20  | unallocated   
1460: 20 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 73 70 61   |.**      | spa
1470: 63 65 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a  ce          |.**
1480: 20 20 20 20 20 20 7c 2d 2d 2d 2d 2d 2d 2d 2d 2d        |---------
1490: 2d 2d 2d 2d 2d 2d 2d 7c 20 20 20 5e 20 20 47 72  -------|   ^  Gr
14a0: 6f 77 73 20 75 70 77 61 72 64 73 0a 2a 2a 20 20  ows upwards.**  
14b0: 20 20 20 20 7c 20 63 65 6c 6c 20 63 6f 6e 74 65      | cell conte
14c0: 6e 74 20 20 20 7c 20 20 20 7c 20 20 41 72 62 69  nt   |   |  Arbi
14d0: 74 72 61 72 79 20 6f 72 64 65 72 20 69 6e 74 65  trary order inte
14e0: 72 73 70 65 72 73 65 64 20 77 69 74 68 20 66 72  rspersed with fr
14f0: 65 65 62 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20  eeblocks..**    
1500: 20 20 7c 20 61 72 65 61 20 20 20 20 20 20 20 20    | area        
1510: 20 20 20 7c 20 20 20 7c 20 20 61 6e 64 20 66 72     |   |  and fr
1520: 65 65 20 73 70 61 63 65 20 66 72 61 67 6d 65 6e  ee space fragmen
1530: 74 73 2e 0a 2a 2a 20 20 20 20 20 20 7c 2d 2d 2d  ts..**      |---
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 7c 0a 2a  -------------|.*
1550: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 68 65  *.** The page he
1560: 61 64 65 72 73 20 6c 6f 6f 6b 73 20 6c 69 6b 65  aders looks like
1570: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f   this:.**.**   O
1580: 46 46 53 45 54 20 20 20 53 49 5a 45 20 20 20 20  FFSET   SIZE    
1590: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
15a0: 20 20 20 20 20 30 20 20 20 20 20 20 20 31 20 20       0       1  
15b0: 20 20 20 20 46 6c 61 67 73 2e 20 31 3a 20 69 6e      Flags. 1: in
15c0: 74 6b 65 79 2c 20 32 3a 20 7a 65 72 6f 64 61 74  tkey, 2: zerodat
15d0: 61 2c 20 34 3a 20 6c 65 61 66 64 61 74 61 2c 20  a, 4: leafdata, 
15e0: 38 3a 20 6c 65 61 66 0a 2a 2a 20 20 20 20 20 20  8: leaf.**      
15f0: 31 20 20 20 20 20 20 20 32 20 20 20 20 20 20 62  1       2      b
1600: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  yte offset to th
1610: 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
1620: 6b 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  k.**      3     
1630: 20 20 32 20 20 20 20 20 20 6e 75 6d 62 65 72 20    2      number 
1640: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 69 73  of cells on this
1650: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 35 20   page.**      5 
1660: 20 20 20 20 20 20 32 20 20 20 20 20 20 66 69 72        2      fir
1670: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
1680: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
1690: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
16a0: 20 31 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f   1      number o
16b0: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 66 72 65  f fragmented fre
16c0: 65 20 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20  e bytes.**      
16d0: 38 20 20 20 20 20 20 20 34 20 20 20 20 20 20 52  8       4      R
16e0: 69 67 68 74 20 63 68 69 6c 64 20 28 74 68 65 20  ight child (the 
16f0: 50 74 72 28 4e 29 20 76 61 6c 75 65 29 2e 20 20  Ptr(N) value).  
1700: 4f 6d 69 74 74 65 64 20 6f 6e 20 6c 65 61 76 65  Omitted on leave
1710: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  s..**.** The fla
1720: 67 73 20 64 65 66 69 6e 65 20 74 68 65 20 66 6f  gs define the fo
1730: 72 6d 61 74 20 6f 66 20 74 68 69 73 20 62 74 72  rmat of this btr
1740: 65 65 20 70 61 67 65 2e 20 20 54 68 65 20 6c 65  ee page.  The le
1750: 61 66 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  af flag means th
1760: 61 74 0a 2a 2a 20 74 68 69 73 20 70 61 67 65 20  at.** this page 
1770: 68 61 73 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2e  has no children.
1780: 20 20 54 68 65 20 7a 65 72 6f 64 61 74 61 20 66    The zerodata f
1790: 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
17a0: 68 69 73 20 70 61 67 65 20 63 61 72 72 69 65 73  his page carries
17b0: 0a 2a 2a 20 6f 6e 6c 79 20 6b 65 79 73 20 61 6e  .** only keys an
17c0: 64 20 6e 6f 20 64 61 74 61 2e 20 20 54 68 65 20  d no data.  The 
17d0: 69 6e 74 6b 65 79 20 66 6c 61 67 20 6d 65 61 6e  intkey flag mean
17e0: 73 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69  s that the key i
17f0: 73 20 61 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77  s a integer.** w
1800: 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69  hich is stored i
1810: 6e 20 74 68 65 20 6b 65 79 20 73 69 7a 65 20 65  n the key size e
1820: 6e 74 72 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  ntry of the cell
1830: 20 68 65 61 64 65 72 20 72 61 74 68 65 72 20 74   header rather t
1840: 68 61 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61  han in.** the pa
1850: 79 6c 6f 61 64 20 61 72 65 61 2e 0a 2a 2a 0a 2a  yload area..**.*
1860: 2a 20 54 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  * The cell point
1870: 65 72 20 61 72 72 61 79 20 62 65 67 69 6e 73 20  er array begins 
1880: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62 79 74  on the first byt
1890: 65 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  e after the page
18a0: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 65 20   header..** The 
18b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
18c0: 61 79 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  ay contains zero
18d0: 20 6f 72 20 6d 6f 72 65 20 32 2d 62 79 74 65 20   or more 2-byte 
18e0: 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
18f0: 65 0a 2a 2a 20 6f 66 66 73 65 74 73 20 66 72 6f  e.** offsets fro
1900: 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
1910: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  of the page to t
1920: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1930: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 63  in the cell.** c
1940: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
1950: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  e cell pointers 
1960: 6f 63 63 75 72 20 69 6e 20 73 6f 72 74 65 64 20  occur in sorted 
1970: 6f 72 64 65 72 2e 20 20 54 68 65 20 73 79 73 74  order.  The syst
1980: 65 6d 20 73 74 72 69 76 65 73 0a 2a 2a 20 74 6f  em strives.** to
1990: 20 6b 65 65 70 20 66 72 65 65 20 73 70 61 63 65   keep free space
19a0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
19b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 73 6f 20  cell pointer so 
19c0: 74 68 61 74 20 6e 65 77 20 63 65 6c 6c 73 20 63  that new cells c
19d0: 61 6e 0a 2a 2a 20 62 65 20 65 61 73 69 6c 79 20  an.** be easily 
19e0: 61 64 64 65 64 20 77 69 74 68 6f 75 74 20 68 61  added without ha
19f0: 76 69 6e 67 20 74 6f 20 64 65 66 72 61 67 6d 65  ving to defragme
1a00: 6e 74 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  nt the page..**.
1a10: 2a 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ** Cell content 
1a20: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
1a30: 20 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65   very end of the
1a40: 20 70 61 67 65 20 61 6e 64 20 67 72 6f 77 73 20   page and grows 
1a50: 74 6f 77 61 72 64 20 74 68 65 0a 2a 2a 20 62 65  toward the.** be
1a60: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
1a70: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 55 6e 75 73 65  age..**.** Unuse
1a80: 64 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74  d space within t
1a90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1aa0: 61 72 65 61 20 69 73 20 63 6f 6c 6c 65 63 74 65  area is collecte
1ab0: 64 20 69 6e 74 6f 20 61 20 6c 69 6e 6b 65 64 20  d into a linked 
1ac0: 6c 69 73 74 20 6f 66 0a 2a 2a 20 66 72 65 65 62  list of.** freeb
1ad0: 6c 6f 63 6b 73 2e 20 20 45 61 63 68 20 66 72 65  locks.  Each fre
1ae0: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 6c 65 61  eblock is at lea
1af0: 73 74 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  st 4 bytes in si
1b00: 7a 65 2e 20 20 54 68 65 20 62 79 74 65 20 6f 66  ze.  The byte of
1b10: 66 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 66  fset.** to the f
1b20: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 69  irst freeblock i
1b30: 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 68  s given in the h
1b40: 65 61 64 65 72 2e 20 20 46 72 65 65 62 6c 6f 63  eader.  Freebloc
1b50: 6b 73 20 6f 63 63 75 72 20 69 6e 0a 2a 2a 20 69  ks occur in.** i
1b60: 6e 63 72 65 61 73 69 6e 67 20 6f 72 64 65 72 2e  ncreasing order.
1b70: 20 20 42 65 63 61 75 73 65 20 61 20 66 72 65 65    Because a free
1b80: 62 6c 6f 63 6b 20 6d 75 73 74 20 62 65 20 61 74  block must be at
1b90: 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 69   least 4 bytes i
1ba0: 6e 20 73 69 7a 65 2c 0a 2a 2a 20 61 6e 79 20 67  n size,.** any g
1bb0: 72 6f 75 70 20 6f 66 20 33 20 6f 72 20 66 65 77  roup of 3 or few
1bc0: 65 72 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  er unused bytes 
1bd0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  in the cell cont
1be0: 65 6e 74 20 61 72 65 61 20 63 61 6e 6e 6f 74 0a  ent area cannot.
1bf0: 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1c00: 66 72 65 65 62 6c 6f 63 6b 20 63 68 61 69 6e 2e  freeblock chain.
1c10: 20 20 41 20 67 72 6f 75 70 20 6f 66 20 33 20 6f    A group of 3 o
1c20: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 79 74  r fewer free byt
1c30: 65 73 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  es is called.** 
1c40: 61 20 66 72 61 67 6d 65 6e 74 2e 20 20 54 68 65  a fragment.  The
1c50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1c60: 20 62 79 74 65 73 20 69 6e 20 61 6c 6c 20 66 72   bytes in all fr
1c70: 61 67 6d 65 6e 74 73 20 69 73 20 72 65 63 6f 72  agments is recor
1c80: 64 65 64 2e 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ded..** in the p
1c90: 61 67 65 20 68 65 61 64 65 72 20 61 74 20 6f 66  age header at of
1ca0: 66 73 65 74 20 37 2e 0a 2a 2a 0a 2a 2a 20 20 20  fset 7..**.**   
1cb0: 20 53 49 5a 45 20 20 20 20 44 45 53 43 52 49 50   SIZE    DESCRIP
1cc0: 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 20 32 20 20  TION.**      2  
1cd0: 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f     Byte offset o
1ce0: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
1cf0: 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 20 32 20 20  lock.**      2  
1d00: 20 20 20 42 79 74 65 73 20 69 6e 20 74 68 69 73     Bytes in this
1d10: 20 66 72 65 65 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a   freeblock.**.**
1d20: 20 43 65 6c 6c 73 20 61 72 65 20 6f 66 20 76 61   Cells are of va
1d30: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 2e 20 20  riable length.  
1d40: 43 65 6c 6c 73 20 61 72 65 20 73 74 6f 72 65 64  Cells are stored
1d50: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   in the cell con
1d60: 74 65 6e 74 20 61 72 65 61 20 61 74 0a 2a 2a 20  tent area at.** 
1d70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1d80: 61 67 65 2e 20 20 50 6f 69 6e 74 65 72 73 20 74  age.  Pointers t
1d90: 6f 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20  o the cells are 
1da0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  in the cell poin
1db0: 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 74 68 61  ter array.** tha
1dc0: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1dd0: 6c 6c 6f 77 73 20 74 68 65 20 70 61 67 65 20 68  llows the page h
1de0: 65 61 64 65 72 2e 20 20 43 65 6c 6c 73 20 69 73  eader.  Cells is
1df0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e00: 0a 2a 2a 20 63 6f 6e 74 69 67 75 6f 75 73 20 6f  .** contiguous o
1e10: 72 20 69 6e 20 6f 72 64 65 72 2c 20 62 75 74 20  r in order, but 
1e20: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 72  cell pointers ar
1e30: 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 6e 64  e contiguous and
1e40: 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a   in order..**.**
1e50: 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6d 61   Cell content ma
1e60: 6b 65 73 20 75 73 65 20 6f 66 20 76 61 72 69 61  kes use of varia
1e70: 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
1e80: 65 72 73 2e 20 20 41 20 76 61 72 69 61 62 6c 65  ers.  A variable
1e90: 0a 2a 2a 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  .** length integ
1ea0: 65 72 20 69 73 20 31 20 74 6f 20 39 20 62 79 74  er is 1 to 9 byt
1eb0: 65 73 20 77 68 65 72 65 20 74 68 65 20 6c 6f 77  es where the low
1ec0: 65 72 20 37 20 62 69 74 73 20 6f 66 20 65 61 63  er 7 bits of eac
1ed0: 68 20 0a 2a 2a 20 62 79 74 65 20 61 72 65 20 75  h .** byte are u
1ee0: 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 67 65  sed.  The intege
1ef0: 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6c  r consists of al
1f00: 6c 20 62 79 74 65 73 20 74 68 61 74 20 68 61 76  l bytes that hav
1f10: 65 20 62 69 74 20 38 20 73 65 74 20 61 6e 64 0a  e bit 8 set and.
1f20: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
1f30: 65 20 77 69 74 68 20 62 69 74 20 38 20 63 6c 65  e with bit 8 cle
1f40: 61 72 2e 20 20 54 68 65 20 6d 6f 73 74 20 73 69  ar.  The most si
1f50: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 6f  gnificant byte o
1f60: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
1f70: 20 61 70 70 65 61 72 73 20 66 69 72 73 74 2e 20   appears first. 
1f80: 20 41 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67   A variable-leng
1f90: 74 68 20 69 6e 74 65 67 65 72 20 6d 61 79 20 6e  th integer may n
1fa0: 6f 74 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ot be more than 
1fb0: 39 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a  9 bytes long..**
1fc0: 20 41 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   As a special ca
1fd0: 73 65 2c 20 61 6c 6c 20 38 20 62 79 74 65 73 20  se, all 8 bytes 
1fe0: 6f 66 20 74 68 65 20 39 74 68 20 62 79 74 65 20  of the 9th byte 
1ff0: 61 72 65 20 75 73 65 64 20 61 73 20 64 61 74 61  are used as data
2000: 2e 20 20 54 68 69 73 0a 2a 2a 20 61 6c 6c 6f 77  .  This.** allow
2010: 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
2020: 65 72 20 74 6f 20 62 65 20 65 6e 63 6f 64 65 64  er to be encoded
2030: 20 69 6e 20 39 20 62 79 74 65 73 2e 0a 2a 2a 0a   in 9 bytes..**.
2040: 2a 2a 20 20 20 20 30 78 30 30 20 20 20 20 20 20  **    0x00      
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
2070: 30 30 30 0a 2a 2a 20 20 20 20 30 78 37 66 20 20  000.**    0x7f  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 62 65 63 6f 6d 65 73 20 20 30 78 30      becomes  0x0
20a0: 30 30 30 30 30 37 66 0a 2a 2a 20 20 20 20 30 78  000007f.**    0x
20b0: 38 31 20 30 78 30 30 20 20 20 20 20 20 20 20 20  81 0x00         
20c0: 20 20 20 20 20 20 20 20 62 65 63 6f 6d 65 73 20          becomes 
20d0: 20 30 78 30 30 30 30 30 30 38 30 0a 2a 2a 20 20   0x00000080.**  
20e0: 20 20 30 78 38 32 20 30 78 30 30 20 20 20 20 20    0x82 0x00     
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 63 6f              beco
2100: 6d 65 73 20 20 30 78 30 30 30 30 30 31 30 30 0a  mes  0x00000100.
2110: 2a 2a 20 20 20 20 30 78 38 30 20 30 78 37 66 20  **    0x80 0x7f 
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 62 65 63 6f 6d 65 73 20 20 30 78 30 30 30 30 30  becomes  0x00000
2140: 30 37 66 0a 2a 2a 20 20 20 20 30 78 38 61 20 30  07f.**    0x8a 0
2150: 78 39 31 20 30 78 64 31 20 30 78 61 63 20 30 78  x91 0xd1 0xac 0x
2160: 37 38 20 20 62 65 63 6f 6d 65 73 20 20 30 78 31  78  becomes  0x1
2170: 32 33 34 35 36 37 38 0a 2a 2a 20 20 20 20 30 78  2345678.**    0x
2180: 38 31 20 30 78 38 31 20 30 78 38 31 20 30 78 38  81 0x81 0x81 0x8
2190: 31 20 30 78 30 31 20 20 62 65 63 6f 6d 65 73 20  1 0x01  becomes 
21a0: 20 30 78 31 30 32 30 34 30 38 31 0a 2a 2a 0a 2a   0x10204081.**.*
21b0: 2a 20 56 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  * Variable lengt
21c0: 68 20 69 6e 74 65 67 65 72 73 20 61 72 65 20 75  h integers are u
21d0: 73 65 64 20 66 6f 72 20 72 6f 77 69 64 73 20 61  sed for rowids a
21e0: 6e 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  nd to hold the n
21f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
2200: 73 20 6f 66 20 6b 65 79 20 61 6e 64 20 64 61 74  s of key and dat
2210: 61 20 69 6e 20 61 20 62 74 72 65 65 20 63 65 6c  a in a btree cel
2220: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  l..**.** The con
2230: 74 65 6e 74 20 6f 66 20 61 20 63 65 6c 6c 20 6c  tent of a cell l
2240: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
2250: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
2260: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
2270: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2280: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 65  number of the le
2290: 66 74 20 63 68 69 6c 64 2e 20 4f 6d 69 74 74 65  ft child. Omitte
22a0: 64 20 69 66 20 6c 65 61 66 20 66 6c 61 67 20 69  d if leaf flag i
22b0: 73 20 73 65 74 2e 0a 2a 2a 20 20 20 20 20 76 61  s set..**     va
22c0: 72 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62  r    Number of b
22d0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 20 4f 6d  ytes of data. Om
22e0: 69 74 74 65 64 20 69 66 20 74 68 65 20 7a 65 72  itted if the zer
22f0: 6f 64 61 74 61 20 66 6c 61 67 20 69 73 20 73 65  odata flag is se
2300: 74 2e 0a 2a 2a 20 20 20 20 20 76 61 72 20 20 20  t..**     var   
2310: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2320: 20 6f 66 20 6b 65 79 2e 20 4f 72 20 74 68 65 20   of key. Or the 
2330: 6b 65 79 20 69 74 73 65 6c 66 20 69 66 20 69 6e  key itself if in
2340: 74 6b 65 79 20 66 6c 61 67 20 69 73 20 73 65 74  tkey flag is set
2350: 2e 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20  ..**      *     
2360: 50 61 79 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  Payload.**      
2370: 34 20 20 20 20 20 46 69 72 73 74 20 70 61 67 65  4     First page
2380: 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   of the overflow
2390: 20 63 68 61 69 6e 2e 20 20 4f 6d 69 74 74 65 64   chain.  Omitted
23a0: 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   if no overflow.
23b0: 2a 2a 0a 2a 2a 20 4f 76 65 72 66 6c 6f 77 20 70  **.** Overflow p
23c0: 61 67 65 73 20 66 6f 72 6d 20 61 20 6c 69 6e 6b  ages form a link
23d0: 65 64 20 6c 69 73 74 2e 20 20 45 61 63 68 20 70  ed list.  Each p
23e0: 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 6c  age except the l
23f0: 61 73 74 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ast is completel
2400: 79 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68  y.** filled with
2410: 20 64 61 74 61 20 28 70 61 67 65 73 69 7a 65 20   data (pagesize 
2420: 2d 20 34 20 62 79 74 65 73 29 2e 20 20 54 68 65  - 4 bytes).  The
2430: 20 6c 61 73 74 20 70 61 67 65 20 63 61 6e 20 68   last page can h
2440: 61 76 65 20 61 73 20 6c 69 74 74 6c 65 0a 2a 2a  ave as little.**
2450: 20 61 73 20 31 20 62 79 74 65 20 6f 66 20 64 61   as 1 byte of da
2460: 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a  ta..**.**    SIZ
2470: 45 20 20 20 20 44 45 53 43 52 49 50 54 49 4f 4e  E    DESCRIPTION
2480: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 50  .**      4     P
2490: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  age number of ne
24a0: 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24b0: 0a 2a 2a 20 20 20 20 20 20 2a 20 20 20 20 20 44  .**      *     D
24c0: 61 74 61 0a 2a 2a 0a 2a 2a 20 46 72 65 65 6c 69  ata.**.** Freeli
24d0: 73 74 20 70 61 67 65 73 20 63 6f 6d 65 20 69 6e  st pages come in
24e0: 20 74 77 6f 20 73 75 62 74 79 70 65 73 3a 20 74   two subtypes: t
24f0: 72 75 6e 6b 20 70 61 67 65 73 20 61 6e 64 20 6c  runk pages and l
2500: 65 61 66 20 70 61 67 65 73 2e 20 20 54 68 65 0a  eaf pages.  The.
2510: 2a 2a 20 66 69 6c 65 20 68 65 61 64 65 72 20 70  ** file header p
2520: 6f 69 6e 74 73 20 74 6f 20 66 69 72 73 74 20 69  oints to first i
2530: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
2540: 6f 66 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 20  of trunk page.  
2550: 45 61 63 68 20 74 72 75 6e 6b 0a 2a 2a 20 70 61  Each trunk.** pa
2560: 67 65 20 70 6f 69 6e 74 73 20 74 6f 20 6d 75 6c  ge points to mul
2570: 74 69 70 6c 65 20 6c 65 61 66 20 70 61 67 65 73  tiple leaf pages
2580: 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  .  The content o
2590: 66 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  f a leaf page is
25a0: 0a 2a 2a 20 75 6e 73 70 65 63 69 66 69 65 64 2e  .** unspecified.
25b0: 20 20 41 20 74 72 75 6e 6b 20 70 61 67 65 20 6c    A trunk page l
25c0: 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
25d0: 2a 2a 0a 2a 2a 20 20 20 20 53 49 5a 45 20 20 20  **.**    SIZE   
25e0: 20 44 45 53 43 52 49 50 54 49 4f 4e 0a 2a 2a 20   DESCRIPTION.** 
25f0: 20 20 20 20 20 34 20 20 20 20 20 50 61 67 65 20       4     Page 
2600: 6e 75 6d 62 65 72 20 6f 66 20 6e 65 78 74 20 74  number of next t
2610: 72 75 6e 6b 20 70 61 67 65 0a 2a 2a 20 20 20 20  runk page.**    
2620: 20 20 34 20 20 20 20 20 4e 75 6d 62 65 72 20 6f    4     Number o
2630: 66 20 6c 65 61 66 20 70 6f 69 6e 74 65 72 73 20  f leaf pointers 
2640: 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
2650: 20 20 20 20 20 2a 20 20 20 20 20 7a 65 72 6f 20       *     zero 
2660: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 6e 75  or more pages nu
2670: 6d 62 65 72 73 20 6f 66 20 6c 65 61 76 65 73 0a  mbers of leaves.
2680: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
2690: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
26a0: 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e  de "pager.h".#in
26b0: 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68 22 0a  clude "btree.h".
26c0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
26d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
26e0: 2e 68 3e 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75 70  .h>../* Round up
26f0: 20 61 20 6e 75 6d 62 65 72 20 74 6f 20 74 68 65   a number to the
2700: 20 6e 65 78 74 20 6c 61 72 67 65 72 20 6d 75 6c   next larger mul
2710: 74 69 70 6c 65 20 6f 66 20 38 2e 20 20 54 68 69  tiple of 8.  Thi
2720: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
2730: 66 6f 72 63 65 20 38 2d 62 79 74 65 20 61 6c 69  force 8-byte ali
2740: 67 6e 6d 65 6e 74 20 6f 6e 20 36 34 2d 62 69 74  gnment on 64-bit
2750: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a   architectures..
2760: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 4f 55 4e 44  */.#define ROUND
2770: 38 28 78 29 20 20 20 28 28 78 2b 37 29 26 7e 37  8(x)   ((x+7)&~7
2780: 29 0a 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ).../* The follo
2790: 77 69 6e 67 20 76 61 6c 75 65 20 69 73 20 74 68  wing value is th
27a0: 65 20 6d 61 78 69 6d 75 6d 20 63 65 6c 6c 20 73  e maximum cell s
27b0: 69 7a 65 20 61 73 73 75 6d 69 6e 67 20 61 20 6d  ize assuming a m
27c0: 61 78 69 6d 75 6d 20 70 61 67 65 0a 2a 2a 20 73  aximum page.** s
27d0: 69 7a 65 20 67 69 76 65 20 61 62 6f 76 65 2e 0a  ize give above..
27e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 45  */.#define MX_CE
27f0: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 20 28 70  LL_SIZE(pBt)  (p
2800: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 38 29 0a  Bt->pageSize-8).
2810: 0a 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  ./* The maximum 
2820: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2830: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
2840: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2850: 2e 20 20 54 68 69 73 0a 2a 2a 20 61 73 73 75 6d  .  This.** assum
2860: 65 73 20 61 20 6d 69 6e 69 6d 75 6d 20 63 65 6c  es a minimum cel
2870: 6c 20 73 69 7a 65 20 6f 66 20 33 20 62 79 74 65  l size of 3 byte
2880: 73 2e 20 20 53 75 63 68 20 73 6d 61 6c 6c 20 63  s.  Such small c
2890: 65 6c 6c 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ells will be.** 
28a0: 65 78 63 65 65 64 69 6e 67 6c 79 20 72 61 72 65  exceedingly rare
28b0: 2c 20 62 75 74 20 74 68 65 79 20 61 72 65 20 70  , but they are p
28c0: 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  ossible..*/.#def
28d0: 69 6e 65 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ine MX_CELL(pBt)
28e0: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
28f0: 2d 38 29 2f 33 29 0a 0a 2f 2a 20 46 6f 72 77 61  -8)/3)../* Forwa
2900: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd declarations 
2910: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2920: 74 20 4d 65 6d 50 61 67 65 20 4d 65 6d 50 61 67  t MemPage MemPag
2930: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
2940: 74 20 42 74 4c 6f 63 6b 20 42 74 4c 6f 63 6b 3b  t BtLock BtLock;
2950: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2960: 61 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 74  a magic string t
2970: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
2980: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2990: 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69 74 65 20  every.** SQLite 
29a0: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
29b0: 72 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  r to identify th
29c0: 65 20 66 69 6c 65 20 61 73 20 61 20 72 65 61 6c  e file as a real
29d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
29e0: 20 59 6f 75 20 63 61 6e 20 63 68 61 6e 67 65 20   You can change 
29f0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 63 6f  this value at co
2a00: 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 73 70  mpile-time by sp
2a10: 65 63 69 66 79 69 6e 67 20 61 0a 2a 2a 20 2d 44  ecifying a.** -D
2a20: 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
2a30: 45 52 3d 22 2e 2e 2e 22 20 6f 6e 20 74 68 65 20  ER="..." on the 
2a40: 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64  compiler command
2a50: 2d 6c 69 6e 65 2e 20 20 54 68 65 0a 2a 2a 20 68  -line.  The.** h
2a60: 65 61 64 65 72 20 6d 75 73 74 20 62 65 20 65 78  eader must be ex
2a70: 61 63 74 6c 79 20 31 36 20 62 79 74 65 73 20 69  actly 16 bytes i
2a80: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 7a 65 72  ncluding the zer
2a90: 6f 2d 74 65 72 6d 69 6e 61 74 6f 72 20 73 6f 0a  o-terminator so.
2aa0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 74  ** the string it
2ab0: 73 65 6c 66 20 73 68 6f 75 6c 64 20 62 65 20 31  self should be 1
2ac0: 35 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e  5 characters lon
2ad0: 67 2e 20 20 49 66 20 79 6f 75 20 63 68 61 6e 67  g.  If you chang
2ae0: 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 2c  e.** the header,
2af0: 20 74 68 65 6e 20 79 6f 75 72 20 63 75 73 74 6f   then your custo
2b00: 6d 20 6c 69 62 72 61 72 79 20 77 69 6c 6c 20 6e  m library will n
2b10: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72 65  ot be able to re
2b20: 61 64 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 73  ad .** databases
2b30: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2b40: 65 20 73 74 61 6e 64 61 72 64 20 74 6f 6f 6c 73  e standard tools
2b50: 20 61 6e 64 20 74 68 65 20 73 74 61 6e 64 61 72   and the standar
2b60: 64 20 74 6f 6f 6c 73 0a 2a 2a 20 77 69 6c 6c 20  d tools.** will 
2b70: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 72  not be able to r
2b80: 65 61 64 20 64 61 74 61 62 61 73 65 73 20 63 72  ead databases cr
2b90: 65 61 74 65 64 20 62 79 20 79 6f 75 72 20 63 75  eated by your cu
2ba0: 73 74 6f 6d 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  stom library..*/
2bb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc0: 46 49 4c 45 5f 48 45 41 44 45 52 20 2f 2a 20 31  FILE_HEADER /* 1
2bd0: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 20  23456789 123456 
2be0: 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  */.#  define SQL
2bf0: 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 20  ITE_FILE_HEADER 
2c00: 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33  "SQLite format 3
2c10: 22 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ".#endif.static 
2c20: 63 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69  const char zMagi
2c30: 63 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49  cHeader[] = SQLI
2c40: 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a  TE_FILE_HEADER;.
2c50: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 74 79 70 65  ./*.** Page type
2c60: 20 66 6c 61 67 73 2e 20 20 41 6e 20 4f 52 65 64   flags.  An ORed
2c70: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
2c80: 74 68 65 73 65 20 66 6c 61 67 73 20 61 70 70 65  these flags appe
2c90: 61 72 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ar as the.** fir
2ca0: 73 74 20 62 79 74 65 20 6f 66 20 65 76 65 72 79  st byte of every
2cb0: 20 42 54 72 65 65 20 70 61 67 65 2e 0a 2a 2f 0a   BTree page..*/.
2cc0: 23 64 65 66 69 6e 65 20 50 54 46 5f 49 4e 54 4b  #define PTF_INTK
2cd0: 45 59 20 20 20 20 30 78 30 31 0a 23 64 65 66 69  EY    0x01.#defi
2ce0: 6e 65 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  ne PTF_ZERODATA 
2cf0: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 50 54   0x02.#define PT
2d00: 46 5f 4c 45 41 46 44 41 54 41 20 20 30 78 30 34  F_LEAFDATA  0x04
2d10: 0a 23 64 65 66 69 6e 65 20 50 54 46 5f 4c 45 41  .#define PTF_LEA
2d20: 46 20 20 20 20 20 20 30 78 30 38 0a 0a 2f 2a 0a  F      0x08../*.
2d30: 2a 2a 20 41 73 20 65 61 63 68 20 70 61 67 65 20  ** As each page 
2d40: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6c  of the file is l
2d50: 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
2d60: 79 2c 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  y, an instance o
2d70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
2d80: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
2d90: 61 70 70 65 6e 64 65 64 20 61 6e 64 20 69 6e 69  appended and ini
2da0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
2db0: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
2dc0: 65 20 73 74 6f 72 65 73 0a 2a 2a 20 69 6e 66 6f  e stores.** info
2dd0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2de0: 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20 64  e page that is d
2df0: 65 63 6f 64 65 64 20 66 72 6f 6d 20 74 68 65 20  ecoded from the 
2e00: 72 61 77 20 66 69 6c 65 20 70 61 67 65 2e 0a 2a  raw file page..*
2e10: 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
2e20: 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 62 61   field points ba
2e30: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
2e40: 20 70 61 67 65 2e 20 20 54 68 69 73 20 61 6c 6c   page.  This all
2e50: 6f 77 73 20 75 73 20 74 6f 0a 2a 2a 20 77 61 6c  ows us to.** wal
2e60: 6b 20 75 70 20 74 68 65 20 42 54 72 65 65 20 66  k up the BTree f
2e70: 72 6f 6d 20 61 6e 79 20 6c 65 61 66 20 74 6f 20  rom any leaf to 
2e80: 74 68 65 20 72 6f 6f 74 2e 20 20 43 61 72 65 20  the root.  Care 
2e90: 6d 75 73 74 20 62 65 20 74 61 6b 65 6e 20 74 6f  must be taken to
2ea0: 0a 2a 2a 20 75 6e 72 65 66 28 29 20 74 68 65 20  .** unref() the 
2eb0: 70 61 72 65 6e 74 20 70 61 67 65 20 70 6f 69 6e  parent page poin
2ec0: 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 70 61  ter when this pa
2ed0: 67 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ge is no longer 
2ee0: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 54  referenced..** T
2ef0: 68 65 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  he pageDestructo
2f00: 72 28 29 20 72 6f 75 74 69 6e 65 20 68 61 6e 64  r() routine hand
2f10: 6c 65 73 20 74 68 61 74 20 63 68 6f 72 65 2e 0a  les that chore..
2f20: 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 50 61 67  */.struct MemPag
2f30: 65 20 7b 0a 20 20 75 38 20 69 73 49 6e 69 74 3b  e {.  u8 isInit;
2f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2f50: 75 65 20 69 66 20 70 72 65 76 69 6f 75 73 6c 79  ue if previously
2f60: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 4d 55   initialized. MU
2f70: 53 54 20 42 45 20 46 49 52 53 54 21 20 2a 2f 0a  ST BE FIRST! */.
2f80: 20 20 75 38 20 69 64 78 53 68 69 66 74 3b 20 20    u8 idxShift;  
2f90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2fa0: 66 20 43 65 6c 6c 20 69 6e 64 69 63 65 73 20 68  f Cell indices h
2fb0: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2fc0: 20 75 38 20 6e 4f 76 65 72 66 6c 6f 77 3b 20 20   u8 nOverflow;  
2fd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2fe0: 6f 66 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  of overflow cell
2ff0: 20 62 6f 64 69 65 73 20 69 6e 20 61 43 65 6c 6c   bodies in aCell
3000: 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 6e 74 4b 65  [] */.  u8 intKe
3010: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
3020: 54 72 75 65 20 69 66 20 69 6e 74 6b 65 79 20 66  True if intkey f
3030: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 20 20  lag is set */.  
3040: 75 38 20 6c 65 61 66 3b 20 20 20 20 20 20 20 20  u8 leaf;        
3050: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3060: 6c 65 61 66 20 66 6c 61 67 20 69 73 20 73 65 74  leaf flag is set
3070: 20 2a 2f 0a 20 20 75 38 20 7a 65 72 6f 44 61 74   */.  u8 zeroDat
3080: 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  a;         /* Tr
3090: 75 65 20 69 66 20 74 61 62 6c 65 20 73 74 6f 72  ue if table stor
30a0: 65 73 20 6b 65 79 73 20 6f 6e 6c 79 20 2a 2f 0a  es keys only */.
30b0: 20 20 75 38 20 6c 65 61 66 44 61 74 61 3b 20 20    u8 leafData;  
30c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30d0: 66 20 74 61 62 6c 65 73 20 73 74 6f 72 65 73 20  f tables stores 
30e0: 64 61 74 61 20 6f 6e 20 6c 65 61 76 65 73 20 6f  data on leaves o
30f0: 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 68 61 73 44  nly */.  u8 hasD
3100: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
3110: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 70 61   True if this pa
3120: 67 65 20 73 74 6f 72 65 73 20 64 61 74 61 20 2a  ge stores data *
3130: 2f 0a 20 20 75 38 20 68 64 72 4f 66 66 73 65 74  /.  u8 hdrOffset
3140: 3b 20 20 20 20 20 20 20 20 2f 2a 20 31 30 30 20  ;        /* 100 
3150: 66 6f 72 20 70 61 67 65 20 31 2e 20 20 30 20 6f  for page 1.  0 o
3160: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
3170: 20 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 20   childPtrSize;  
3180: 20 20 20 2f 2a 20 30 20 69 66 20 6c 65 61 66 3d     /* 0 if leaf=
3190: 3d 31 2e 20 20 34 20 69 66 20 6c 65 61 66 3d 3d  =1.  4 if leaf==
31a0: 30 20 2a 2f 0a 20 20 75 31 36 20 6d 61 78 4c 6f  0 */.  u16 maxLo
31b0: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  cal;        /* C
31c0: 6f 70 79 20 6f 66 20 42 74 72 65 65 2e 6d 61 78  opy of Btree.max
31d0: 4c 6f 63 61 6c 20 6f 72 20 42 74 72 65 65 2e 6d  Local or Btree.m
31e0: 61 78 4c 65 61 66 20 2a 2f 0a 20 20 75 31 36 20  axLeaf */.  u16 
31f0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20  minLocal;       
3200: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 42 74 72 65   /* Copy of Btre
3210: 65 2e 6d 69 6e 4c 6f 63 61 6c 20 6f 72 20 42 74  e.minLocal or Bt
3220: 72 65 65 2e 6d 69 6e 4c 65 61 66 20 2a 2f 0a 20  ree.minLeaf */. 
3230: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
3240: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
3250: 6e 20 61 44 61 74 61 20 6f 66 20 66 69 72 73 74  n aData of first
3260: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
3270: 0a 20 20 75 31 36 20 69 64 78 50 61 72 65 6e 74  .  u16 idxParent
3280: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ;       /* Index
3290: 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 74 68   in parent of th
32a0: 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 31 36  is node */.  u16
32b0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
32c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
32d0: 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ree bytes on the
32e0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 6e   page */.  u16 n
32f0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
3300: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
3310: 6c 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  ls on this page,
3320: 20 6c 6f 63 61 6c 20 61 6e 64 20 6f 76 66 6c 20   local and ovfl 
3330: 2a 2f 0a 20 20 73 74 72 75 63 74 20 5f 4f 76 66  */.  struct _Ovf
3340: 6c 43 65 6c 6c 20 7b 20 20 20 2f 2a 20 43 65 6c  lCell {   /* Cel
3350: 6c 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  ls that will not
3360: 20 66 69 74 20 6f 6e 20 61 44 61 74 61 5b 5d 20   fit on aData[] 
3370: 2a 2f 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  */.    u8 *pCell
3380: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ;          /* Po
3390: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 62 6f  inters to the bo
33a0: 64 79 20 6f 66 20 74 68 65 20 6f 76 65 72 66 6c  dy of the overfl
33b0: 6f 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 75  ow cell */.    u
33c0: 31 36 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  16 idx;         
33d0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 69     /* Insert thi
33e0: 73 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 69 64  s cell before id
33f0: 78 2d 74 68 20 6e 6f 6e 2d 6f 76 65 72 66 6c 6f  x-th non-overflo
3400: 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 7d 20 61 4f  w cell */.  } aO
3410: 76 66 6c 5b 35 5d 3b 0a 20 20 42 74 53 68 61 72  vfl[5];.  BtShar
3420: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 2f  ed *pBt;       /
3430: 2a 20 50 6f 69 6e 74 65 72 20 62 61 63 6b 20 74  * Pointer back t
3440: 6f 20 42 54 72 65 65 20 73 74 72 75 63 74 75 72  o BTree structur
3450: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  e */.  u8 *aData
3460: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
3470: 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74  ointer back to t
3480: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
3490: 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
34a0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 20 20 2f   *pDbPage;     /
34b0: 2a 20 50 61 67 65 72 20 70 61 67 65 20 68 61 6e  * Pager page han
34c0: 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  dle */.  Pgno pg
34d0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
34e0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
34f0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
3500: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
3510: 3b 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65  ;    /* The pare
3520: 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 2e  nt of this page.
3530: 20 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20    NULL for root 
3540: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
3550: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
3560: 20 6f 66 20 61 20 64 69 73 6b 20 70 61 67 65 20   of a disk page 
3570: 68 61 73 20 74 68 65 20 61 75 78 69 6c 69 61 72  has the auxiliar
3580: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 70  y information ap
3590: 70 65 6e 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65  pended.** to the
35a0: 20 65 6e 64 2e 20 20 45 58 54 52 41 5f 53 49 5a   end.  EXTRA_SIZ
35b0: 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  E is the number 
35c0: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
35d0: 65 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  e needed to hold
35e0: 0a 2a 2a 20 74 68 61 74 20 65 78 74 72 61 20 69  .** that extra i
35f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23  nformation..*/.#
3600: 64 65 66 69 6e 65 20 45 58 54 52 41 5f 53 49 5a  define EXTRA_SIZ
3610: 45 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  E sizeof(MemPage
3620: 29 0a 0a 2f 2a 20 42 74 72 65 65 20 68 61 6e 64  )../* Btree hand
3630: 6c 65 20 2a 2f 0a 73 74 72 75 63 74 20 42 74 72  le */.struct Btr
3640: 65 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ee {.  sqlite3 *
3650: 70 53 71 6c 69 74 65 3b 0a 20 20 42 74 53 68 61  pSqlite;.  BtSha
3660: 72 65 64 20 2a 70 42 74 3b 0a 20 20 75 38 20 69  red *pBt;.  u8 i
3670: 6e 54 72 61 6e 73 3b 20 20 20 20 20 20 20 20 20  nTrans;         
3680: 20 20 20 2f 2a 20 54 52 41 4e 53 5f 4e 4f 4e 45     /* TRANS_NONE
3690: 2c 20 54 52 41 4e 53 5f 52 45 41 44 20 6f 72 20  , TRANS_READ or 
36a0: 54 52 41 4e 53 5f 57 52 49 54 45 20 2a 2f 0a 7d  TRANS_WRITE */.}
36b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 42 74 72 65 65 2e 69  ;../*.** Btree.i
36c0: 6e 54 72 61 6e 73 20 6d 61 79 20 74 61 6b 65 20  nTrans may take 
36d0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
36e0: 77 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  wing values..**.
36f0: 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
3700: 2d 64 61 74 61 20 65 78 74 65 6e 73 69 6f 6e 20  -data extension 
3710: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72  is enabled, ther
3720: 65 20 6d 61 79 20 62 65 20 6d 75 6c 74 69 70 6c  e may be multipl
3730: 65 20 75 73 65 72 73 0a 2a 2a 20 6f 66 20 74 68  e users.** of th
3740: 65 20 42 74 72 65 65 20 73 74 72 75 63 74 75 72  e Btree structur
3750: 65 2e 20 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  e. At most one o
3760: 66 20 74 68 65 73 65 20 6d 61 79 20 6f 70 65 6e  f these may open
3770: 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
3780: 74 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 61 6e 79  tion,.** but any
3790: 20 6e 75 6d 62 65 72 20 6d 61 79 20 68 61 76 65   number may have
37a0: 20 61 63 74 69 76 65 20 72 65 61 64 20 74 72 61   active read tra
37b0: 6e 73 61 63 74 69 6f 6e 73 2e 20 56 61 72 69 61  nsactions. Varia
37c0: 62 6c 65 20 42 74 72 65 65 2e 70 44 62 20 0a 2a  ble Btree.pDb .*
37d0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
37e0: 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
37f0: 20 61 6e 79 20 63 75 72 72 65 6e 74 20 77 72 69   any current wri
3800: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
3810: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 52 41 4e 53  */.#define TRANS
3820: 5f 4e 4f 4e 45 20 20 30 0a 23 64 65 66 69 6e 65  _NONE  0.#define
3830: 20 54 52 41 4e 53 5f 52 45 41 44 20 20 31 0a 23   TRANS_READ  1.#
3840: 64 65 66 69 6e 65 20 54 52 41 4e 53 5f 57 52 49  define TRANS_WRI
3850: 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 45 76 65 72  TE 2../*.** Ever
3860: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 20 74  ything we need t
3870: 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 20 61 6e 20  o know about an 
3880: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2f  open database.*/
3890: 0a 73 74 72 75 63 74 20 42 74 53 68 61 72 65 64  .struct BtShared
38a0: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
38b0: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er;        /* Th
38c0: 65 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0a  e page cache */.
38d0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
38e0: 73 6f 72 3b 20 20 20 20 2f 2a 20 41 20 6c 69 73  sor;    /* A lis
38f0: 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 63 75  t of all open cu
3900: 72 73 6f 72 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  rsors */.  MemPa
3910: 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
3920: 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
3930: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
3940: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
3950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3960: 65 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 61  e if we are in a
3970: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
3980: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
3990: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
39a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
39b0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  the underlying f
39c0: 69 6c 65 20 69 73 20 72 65 61 64 6f 6e 6c 79 20  ile is readonly 
39d0: 2a 2f 0a 20 20 75 38 20 6d 61 78 45 6d 62 65 64  */.  u8 maxEmbed
39e0: 46 72 61 63 3b 20 20 20 20 20 20 2f 2a 20 4d 61  Frac;      /* Ma
39f0: 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20 61 73  ximum payload as
3a00: 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61 67 65   % of total page
3a10: 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6d 69   size */.  u8 mi
3a20: 6e 45 6d 62 65 64 46 72 61 63 3b 20 20 20 20 20  nEmbedFrac;     
3a30: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 70 61 79 6c   /* Minimum payl
3a40: 6f 61 64 20 61 73 20 25 20 6f 66 20 74 6f 74 61  oad as % of tota
3a50: 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  l page size */. 
3a60: 20 75 38 20 6d 69 6e 4c 65 61 66 46 72 61 63 3b   u8 minLeafFrac;
3a70: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
3a80: 6d 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 61  m leaf payload a
3a90: 73 20 25 20 6f 66 20 74 6f 74 61 6c 20 70 61 67  s % of total pag
3aa0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 75 38 20 70  e size */.  u8 p
3ab0: 61 67 65 53 69 7a 65 46 69 78 65 64 3b 20 20 20  ageSizeFixed;   
3ac0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3ad0: 20 70 61 67 65 20 73 69 7a 65 20 63 61 6e 20 6e   page size can n
3ae0: 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
3af0: 67 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ged */.#ifndef S
3b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
3b10: 41 43 55 55 4d 0a 20 20 75 38 20 61 75 74 6f 56  ACUUM.  u8 autoV
3b20: 61 63 75 75 6d 3b 20 20 20 20 20 20 20 20 2f 2a  acuum;        /*
3b30: 20 54 72 75 65 20 69 66 20 61 75 74 6f 2d 76 61   True if auto-va
3b40: 63 75 75 6d 20 69 73 20 65 6e 61 62 6c 65 64 20  cuum is enabled 
3b50: 2a 2f 0a 20 20 75 38 20 69 6e 63 72 56 61 63 75  */.  u8 incrVacu
3b60: 75 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  um;        /* Tr
3b70: 75 65 20 69 66 20 69 6e 63 72 2d 76 61 63 75 75  ue if incr-vacuu
3b80: 6d 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  m is enabled */.
3b90: 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 3b 20 20    Pgno nTrunc;  
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
3bb0: 65 72 6f 20 69 66 20 74 68 65 20 64 62 20 77 69  ero if the db wi
3bc0: 6c 6c 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ll be truncated 
3bd0: 28 69 6e 63 72 20 76 61 63 75 75 6d 29 20 2a 2f  (incr vacuum) */
3be0: 0a 23 65 6e 64 69 66 0a 20 20 75 31 36 20 70 61  .#endif.  u16 pa
3bf0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
3c00: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3c10: 6f 66 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  of bytes on a pa
3c20: 67 65 20 2a 2f 0a 20 20 75 31 36 20 75 73 61 62  ge */.  u16 usab
3c30: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  leSize;       /*
3c40: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
3c50: 65 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20  e bytes on each 
3c60: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  page */.  int ma
3c70: 78 4c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 20  xLocal;         
3c80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 6f 63 61 6c  /* Maximum local
3c90: 20 70 61 79 6c 6f 61 64 20 69 6e 20 6e 6f 6e 2d   payload in non-
3ca0: 4c 45 41 46 44 41 54 41 20 74 61 62 6c 65 73 20  LEAFDATA tables 
3cb0: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  */.  int minLoca
3cc0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69  l;         /* Mi
3cd0: 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20 70 61 79 6c  nimum local payl
3ce0: 6f 61 64 20 69 6e 20 6e 6f 6e 2d 4c 45 41 46 44  oad in non-LEAFD
3cf0: 41 54 41 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ATA tables */.  
3d00: 69 6e 74 20 6d 61 78 4c 65 61 66 3b 20 20 20 20  int maxLeaf;    
3d10: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
3d20: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 69   local payload i
3d30: 6e 20 61 20 4c 45 41 46 44 41 54 41 20 74 61 62  n a LEAFDATA tab
3d40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  le */.  int minL
3d50: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf;          /*
3d60: 20 4d 69 6e 69 6d 75 6d 20 6c 6f 63 61 6c 20 70   Minimum local p
3d70: 61 79 6c 6f 61 64 20 69 6e 20 61 20 4c 45 41 46  ayload in a LEAF
3d80: 44 41 54 41 20 74 61 62 6c 65 20 2a 2f 0a 20 20  DATA table */.  
3d90: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
3da0: 73 79 48 61 6e 64 6c 65 72 3b 20 20 20 2f 2a 20  syHandler;   /* 
3db0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 77 68 65  Callback for whe
3dc0: 6e 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20  n there is lock 
3dd0: 63 6f 6e 74 65 6e 74 69 6f 6e 20 2a 2f 0a 20 20  contention */.  
3de0: 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
3df0: 3b 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 61 63  ;     /* Transac
3e00: 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 20 20  tion state */.  
3e10: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
3e20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3e30: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
3e40: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3e50: 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 61  */.  int nTransa
3e60: 63 74 69 6f 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  ction;     /* Nu
3e70: 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 74 72 61  mber of open tra
3e80: 6e 73 61 63 74 69 6f 6e 73 20 28 72 65 61 64 20  nsactions (read 
3e90: 2b 20 77 72 69 74 65 29 20 2a 2f 0a 20 20 76 6f  + write) */.  vo
3ea0: 69 64 20 2a 70 53 63 68 65 6d 61 3b 20 20 20 20  id *pSchema;    
3eb0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3ec0: 6f 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  o space allocate
3ed0: 64 20 62 79 20 73 71 6c 69 74 65 33 42 74 72 65  d by sqlite3Btre
3ee0: 65 53 63 68 65 6d 61 28 29 20 2a 2f 0a 20 20 76  eSchema() */.  v
3ef0: 6f 69 64 20 28 2a 78 46 72 65 65 53 63 68 65 6d  oid (*xFreeSchem
3f00: 61 29 28 76 6f 69 64 2a 29 3b 20 20 2f 2a 20 44  a)(void*);  /* D
3f10: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 42 74  estructor for Bt
3f20: 53 68 61 72 65 64 2e 70 53 63 68 65 6d 61 20 2a  Shared.pSchema *
3f30: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
3f40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3f50: 48 45 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  HE.  BtLock *pLo
3f60: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ck;        /* Li
3f70: 73 74 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  st of locks held
3f80: 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
3f90: 62 74 72 65 65 20 73 74 72 75 63 74 20 2a 2f 0a  btree struct */.
3fa0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4e 65 78    BtShared *pNex
3fb0: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
3fc0: 69 6e 20 54 68 72 65 61 64 44 61 74 61 2e 70 42  in ThreadData.pB
3fd0: 74 72 65 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74  tree linked list
3fe0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
3ff0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4000: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4010: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
4020: 73 65 64 20 74 6f 20 68 6f 6c 64 20 69 6e 66 6f  sed to hold info
4030: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74  rmation.** about
4040: 20 61 20 63 65 6c 6c 2e 20 20 54 68 65 20 70 61   a cell.  The pa
4050: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 66 75 6e  rseCellPtr() fun
4060: 63 74 69 6f 6e 20 66 69 6c 6c 73 20 69 6e 20 74  ction fills in t
4070: 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  his structure.**
4080: 20 62 61 73 65 64 20 6f 6e 20 69 6e 66 6f 72 6d   based on inform
4090: 61 74 69 6f 6e 20 65 78 74 72 61 63 74 20 66 72  ation extract fr
40a0: 6f 6d 20 74 68 65 20 72 61 77 20 64 69 73 6b 20  om the raw disk 
40b0: 70 61 67 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  page..*/.typedef
40c0: 20 73 74 72 75 63 74 20 43 65 6c 6c 49 6e 66 6f   struct CellInfo
40d0: 20 43 65 6c 6c 49 6e 66 6f 3b 0a 73 74 72 75 63   CellInfo;.struc
40e0: 74 20 43 65 6c 6c 49 6e 66 6f 20 7b 0a 20 20 75  t CellInfo {.  u
40f0: 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 2f 2a  8 *pCell;     /*
4100: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
4110: 73 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f  start of cell co
4120: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e  ntent */.  i64 n
4130: 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Key;      /* The
4140: 20 6b 65 79 20 66 6f 72 20 49 4e 54 4b 45 59 20   key for INTKEY 
4150: 74 61 62 6c 65 73 2c 20 6f 72 20 6e 75 6d 62 65  tables, or numbe
4160: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6b 65  r of bytes in ke
4170: 79 20 2a 2f 0a 20 20 75 33 32 20 6e 44 61 74 61  y */.  u32 nData
4180: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
4190: 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
41a0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
41b0: 61 64 3b 20 20 2f 2a 20 54 6f 74 61 6c 20 61 6d  ad;  /* Total am
41c0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
41d0: 2a 2f 0a 20 20 75 31 36 20 6e 48 65 61 64 65 72  */.  u16 nHeader
41e0: 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  ;   /* Size of t
41f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
4200: 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
4210: 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 63 61 6c 3b  */.  u16 nLocal;
4220: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
4230: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
4240: 63 61 6c 6c 79 20 2a 2f 0a 20 20 75 31 36 20 69  cally */.  u16 i
4250: 4f 76 65 72 66 6c 6f 77 3b 20 2f 2a 20 4f 66 66  Overflow; /* Off
4260: 73 65 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  set to overflow 
4270: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 5a 65  page number.  Ze
4280: 72 6f 20 69 66 20 6e 6f 20 6f 76 65 72 66 6c 6f  ro if no overflo
4290: 77 20 2a 2f 0a 20 20 75 31 36 20 6e 53 69 7a 65  w */.  u16 nSize
42a0: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
42b0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
42c0: 74 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  t on the main b-
42d0: 74 72 65 65 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a  tree page */.};.
42e0: 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  ./*.** A cursor 
42f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4300: 61 20 70 61 72 74 69 63 75 6c 61 72 20 65 6e 74  a particular ent
4310: 72 79 20 69 6e 20 74 68 65 20 42 54 72 65 65 2e  ry in the BTree.
4320: 0a 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 69 73  .** The entry is
4330: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69   identified by i
4340: 74 73 20 4d 65 6d 50 61 67 65 20 61 6e 64 20 74  ts MemPage and t
4350: 68 65 20 69 6e 64 65 78 20 69 6e 0a 2a 2a 20 4d  he index in.** M
4360: 65 6d 50 61 67 65 2e 61 43 65 6c 6c 5b 5d 20 6f  emPage.aCell[] o
4370: 66 20 74 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  f the entry..*/.
4380: 73 74 72 75 63 74 20 42 74 43 75 72 73 6f 72 20  struct BtCursor 
4390: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
43a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
43b0: 20 54 68 65 20 42 74 72 65 65 20 74 6f 20 77 68   The Btree to wh
43c0: 69 63 68 20 74 68 69 73 20 63 75 72 73 6f 72 20  ich this cursor 
43d0: 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 42 74 43  belongs */.  BtC
43e0: 75 72 73 6f 72 20 2a 70 4e 65 78 74 2c 20 2a 70  ursor *pNext, *p
43f0: 50 72 65 76 3b 20 20 2f 2a 20 46 6f 72 6d 73 20  Prev;  /* Forms 
4400: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
4410: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
4420: 20 20 69 6e 74 20 28 2a 78 43 6f 6d 70 61 72 65    int (*xCompare
4430: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
4440: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
4450: 74 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 4b 65 79  t void*); /* Key
4460: 20 63 6f 6d 70 20 66 75 6e 63 20 2a 2f 0a 20 20   comp func */.  
4470: 76 6f 69 64 20 2a 70 41 72 67 3b 20 20 20 20 20  void *pArg;     
4480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4490: 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
44a0: 72 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  re() */.  Pgno p
44b0: 67 6e 6f 52 6f 6f 74 3b 20 20 20 20 20 20 20 20  gnoRoot;        
44c0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
44d0: 70 61 67 65 20 6f 66 20 74 68 69 73 20 74 72 65  page of this tre
44e0: 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
44f0: 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
4500: 20 2f 2a 20 50 61 67 65 20 74 68 61 74 20 63 6f   /* Page that co
4510: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
4520: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20   */.  int idx;  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
4550: 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
4560: 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 43 65 6c  aCell[] */.  Cel
4570: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 20 20 20 20 20  lInfo info;     
4580: 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72 73         /* A pars
4590: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 77 65  e of the cell we
45a0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
45b0: 20 2a 2f 0a 20 20 75 38 20 77 72 46 6c 61 67 3b   */.  u8 wrFlag;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 69 74 61  /* True if writa
45e0: 62 6c 65 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ble */.  u8 eSta
45f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
4600: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
4610: 20 43 55 52 53 4f 52 5f 58 58 58 20 63 6f 6e 73   CURSOR_XXX cons
4620: 74 61 6e 74 73 20 28 73 65 65 20 62 65 6c 6f 77  tants (see below
4630: 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4b 65  ) */.  void *pKe
4640: 79 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  y;      /* Saved
4650: 20 6b 65 79 20 74 68 61 74 20 77 61 73 20 63 75   key that was cu
4660: 72 73 6f 72 27 73 20 6c 61 73 74 20 6b 6e 6f 77  rsor's last know
4670: 6e 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20  n position */.  
4680: 69 36 34 20 6e 4b 65 79 3b 20 20 20 20 20 20 20  i64 nKey;       
4690: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79   /* Size of pKey
46a0: 2c 20 6f 72 20 6c 61 73 74 20 69 6e 74 65 67 65  , or last intege
46b0: 72 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 73  r key */.  int s
46c0: 6b 69 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 28  kip;        /* (
46d0: 73 6b 69 70 3c 30 29 20 2d 3e 20 50 72 65 76 28  skip<0) -> Prev(
46e0: 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 28 73  ) is a no-op. (s
46f0: 6b 69 70 3e 30 29 20 2d 3e 20 4e 65 78 74 28 29  kip>0) -> Next()
4700: 20 69 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   is */.};../*.**
4710: 20 50 6f 74 65 6e 74 69 61 6c 20 76 61 6c 75 65   Potential value
4720: 73 20 66 6f 72 20 42 74 43 75 72 73 6f 72 2e 65  s for BtCursor.e
4730: 53 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 43 55 52  State..**.** CUR
4740: 53 4f 52 5f 56 41 4c 49 44 3a 0a 2a 2a 20 20 20  SOR_VALID:.**   
4750: 43 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  Cursor points to
4760: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20   a valid entry. 
4770: 67 65 74 50 61 79 6c 6f 61 64 28 29 20 65 74 63  getPayload() etc
4780: 2e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 2e  . may be called.
4790: 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  .**.** CURSOR_IN
47a0: 56 41 4c 49 44 3a 0a 2a 2a 20 20 20 43 75 72 73  VALID:.**   Curs
47b0: 6f 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e  or does not poin
47c0: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
47d0: 72 79 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  ry. This can hap
47e0: 70 65 6e 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  pen (for example
47f0: 29 20 0a 2a 2a 20 20 20 62 65 63 61 75 73 65 20  ) .**   because 
4800: 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
4810: 74 79 20 6f 72 20 62 65 63 61 75 73 65 20 42 74  ty or because Bt
4820: 72 65 65 43 75 72 73 6f 72 46 69 72 73 74 28 29  reeCursorFirst()
4830: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a   has not been.**
4840: 20 20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a     called..**.**
4850: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4860: 45 45 4b 3a 0a 2a 2a 20 20 20 54 68 65 20 74 61  EEK:.**   The ta
4870: 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 63 75  ble that this cu
4880: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
4890: 6f 6e 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2c  on still exists,
48a0: 20 62 75 74 20 68 61 73 20 62 65 65 6e 20 0a 2a   but has been .*
48b0: 2a 20 20 20 6d 6f 64 69 66 69 65 64 20 73 69 6e  *   modified sin
48c0: 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ce the cursor wa
48d0: 73 20 6c 61 73 74 20 75 73 65 64 2e 20 54 68 65  s last used. The
48e0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
48f0: 20 69 73 20 73 61 76 65 64 0a 2a 2a 20 20 20 69   is saved.**   i
4900: 6e 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  n variables BtCu
4910: 72 73 6f 72 2e 70 4b 65 79 20 61 6e 64 20 42 74  rsor.pKey and Bt
4920: 43 75 72 73 6f 72 2e 6e 4b 65 79 2e 20 57 68 65  Cursor.nKey. Whe
4930: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 69 6e  n a cursor is in
4940: 20 0a 2a 2a 20 20 20 74 68 69 73 20 73 74 61 74   .**   this stat
4950: 65 2c 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  e, restoreOrClea
4960: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
4970: 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  ) can be called 
4980: 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  to attempt to.**
4990: 20 20 20 73 65 65 6b 20 74 68 65 20 63 75 72 73     seek the curs
49a0: 6f 72 20 74 6f 20 74 68 65 20 73 61 76 65 64 20  or to the saved 
49b0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 64 65  position..*/.#de
49c0: 66 69 6e 65 20 43 55 52 53 4f 52 5f 49 4e 56 41  fine CURSOR_INVA
49d0: 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 30 0a  LID           0.
49e0: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 56  #define CURSOR_V
49f0: 41 4c 49 44 20 20 20 20 20 20 20 20 20 20 20 20  ALID            
4a00: 20 31 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f   1.#define CURSO
4a10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 20 20  R_REQUIRESEEK   
4a20: 20 20 20 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      2../*.** The
4a30: 20 54 52 41 43 45 20 6d 61 63 72 6f 20 77 69 6c   TRACE macro wil
4a40: 6c 20 70 72 69 6e 74 20 68 69 67 68 2d 6c 65 76  l print high-lev
4a50: 65 6c 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  el status inform
4a60: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a  ation about the.
4a70: 2a 2a 20 62 74 72 65 65 20 6f 70 65 72 61 74 69  ** btree operati
4a80: 6f 6e 20 77 68 65 6e 20 74 68 65 20 67 6c 6f 62  on when the glob
4a90: 61 6c 20 76 61 72 69 61 62 6c 65 20 73 71 6c 69  al variable sqli
4aa0: 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20  te3_btree_trace 
4ab0: 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 2e 0a 2a  is.** enabled..*
4ac0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  /.#if SQLITE_TES
4ad0: 54 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45  T.# define TRACE
4ae0: 28 58 29 20 20 20 69 66 28 20 73 71 6c 69 74 65  (X)   if( sqlite
4af0: 33 5f 62 74 72 65 65 5f 74 72 61 63 65 20 29 5c  3_btree_trace )\
4b00: 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  ./*             
4b10: 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c             { sql
4b20: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
4b30: 58 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  X; fflush(stdout
4b40: 29 3b 20 7d 20 2a 2f 20 5c 0a 7b 20 70 72 69 6e  ); } */ \.{ prin
4b50: 74 66 20 58 3b 20 66 66 6c 75 73 68 28 73 74 64  tf X; fflush(std
4b60: 6f 75 74 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  out); }.int sqli
4b70: 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63 65 3d  te3_btree_trace=
4b80: 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65  0;  /* True to e
4b90: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f  nable tracing */
4ba0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4bb0: 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a  TRACE(X).#endif.
4bc0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
4bd0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
4be0: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
4bf0: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 50  adLocks(Btree*,P
4c00: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
4c10: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6f 72 20 77  ./*.** Read or w
4c20: 72 69 74 65 20 61 20 74 77 6f 2d 20 61 6e 64 20  rite a two- and 
4c30: 66 6f 75 72 2d 62 79 74 65 20 62 69 67 2d 65 6e  four-byte big-en
4c40: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  dian integer val
4c50: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ues..*/.static u
4c60: 33 32 20 67 65 74 32 62 79 74 65 28 75 6e 73 69  32 get2byte(unsi
4c70: 67 6e 65 64 20 63 68 61 72 20 2a 70 29 7b 0a 20  gned char *p){. 
4c80: 20 72 65 74 75 72 6e 20 28 70 5b 30 5d 3c 3c 38   return (p[0]<<8
4c90: 29 20 7c 20 70 5b 31 5d 3b 0a 7d 0a 73 74 61 74  ) | p[1];.}.stat
4ca0: 69 63 20 75 33 32 20 67 65 74 34 62 79 74 65 28  ic u32 get4byte(
4cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4cc0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30  ){.  return (p[0
4cd0: 5d 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c  ]<<24) | (p[1]<<
4ce0: 31 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20  16) | (p[2]<<8) 
4cf0: 7c 20 70 5b 33 5d 3b 0a 7d 0a 73 74 61 74 69 63  | p[3];.}.static
4d00: 20 76 6f 69 64 20 70 75 74 32 62 79 74 65 28 75   void put2byte(u
4d10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c  nsigned char *p,
4d20: 20 75 33 32 20 76 29 7b 0a 20 20 70 5b 30 5d 20   u32 v){.  p[0] 
4d30: 3d 20 76 3e 3e 38 3b 0a 20 20 70 5b 31 5d 20 3d  = v>>8;.  p[1] =
4d40: 20 76 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   v;.}.static voi
4d50: 64 20 70 75 74 34 62 79 74 65 28 75 6e 73 69 67  d put4byte(unsig
4d60: 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75 33 32  ned char *p, u32
4d70: 20 76 29 7b 0a 20 20 70 5b 30 5d 20 3d 20 76 3e   v){.  p[0] = v>
4d80: 3e 32 34 3b 0a 20 20 70 5b 31 5d 20 3d 20 76 3e  >24;.  p[1] = v>
4d90: 3e 31 36 3b 0a 20 20 70 5b 32 5d 20 3d 20 76 3e  >16;.  p[2] = v>
4da0: 3e 38 3b 0a 20 20 70 5b 33 5d 20 3d 20 76 3b 0a  >8;.  p[3] = v;.
4db0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
4dc0: 73 20 74 6f 20 72 65 61 64 20 61 6e 64 20 77 72  s to read and wr
4dd0: 69 74 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  ite variable-len
4de0: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 20 20 54  gth integers.  T
4df0: 68 65 73 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20  hese used to.** 
4e00: 62 65 20 64 65 66 69 6e 65 64 20 6c 6f 63 61 6c  be defined local
4e10: 6c 79 2c 20 62 75 74 20 6e 6f 77 20 77 65 20 75  ly, but now we u
4e20: 73 65 20 74 68 65 20 76 61 72 69 6e 74 20 72 6f  se the varint ro
4e30: 75 74 69 6e 65 73 20 69 6e 20 74 68 65 20 75 74  utines in the ut
4e40: 69 6c 2e 63 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f  il.c.** file..*/
4e50: 0a 23 64 65 66 69 6e 65 20 67 65 74 56 61 72 69  .#define getVari
4e60: 6e 74 20 20 20 20 73 71 6c 69 74 65 33 47 65 74  nt    sqlite3Get
4e70: 56 61 72 69 6e 74 0a 2f 2a 20 23 64 65 66 69 6e  Varint./* #defin
4e80: 65 20 67 65 74 56 61 72 69 6e 74 33 32 20 20 73  e getVarint32  s
4e90: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
4ea0: 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  2 */.#define get
4eb0: 56 61 72 69 6e 74 33 32 28 41 2c 42 29 20 20 28  Varint32(A,B)  (
4ec0: 28 2a 42 3d 2a 28 41 29 29 3c 3d 30 78 37 66 3f  (*B=*(A))<=0x7f?
4ed0: 31 3a 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  1:sqlite3GetVari
4ee0: 6e 74 33 32 28 41 2c 42 29 29 0a 23 64 65 66 69  nt32(A,B)).#defi
4ef0: 6e 65 20 70 75 74 56 61 72 69 6e 74 20 20 20 20  ne putVarint    
4f00: 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
4f10: 0a 0a 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ../* The databas
4f20: 65 20 70 61 67 65 20 74 68 65 20 50 45 4e 44 49  e page the PENDI
4f30: 4e 47 5f 42 59 54 45 20 6f 63 63 75 70 69 65 73  NG_BYTE occupies
4f40: 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20 6e  . This page is n
4f50: 65 76 65 72 20 75 73 65 64 2e 0a 2a 2a 20 54 4f  ever used..** TO
4f60: 44 4f 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  DO: This macro i
4f70: 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 79 20  s very similary 
4f80: 74 6f 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  to PAGER_MJ_PGNO
4f90: 28 29 20 69 6e 20 70 61 67 65 72 2e 63 2e 20 54  () in pager.c. T
4fa0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 70 6f  hey.** should po
4fb0: 73 73 69 62 6c 79 20 62 65 20 63 6f 6e 73 6f 6c  ssibly be consol
4fc0: 69 64 61 74 65 64 20 28 70 72 65 73 75 6d 61 62  idated (presumab
4fd0: 6c 79 20 69 6e 20 70 61 67 65 72 2e 68 29 2e 0a  ly in pager.h)..
4fe0: 2a 2a 0a 2a 2a 20 49 66 20 64 69 73 6b 20 49 2f  **.** If disk I/
4ff0: 4f 20 69 73 20 6f 6d 69 74 74 65 64 20 28 6d 65  O is omitted (me
5000: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20 64  aning that the d
5010: 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
5020: 64 20 70 75 72 65 6c 79 0a 2a 2a 20 69 6e 20 6d  d purely.** in m
5030: 65 6d 6f 72 79 29 20 74 68 65 6e 20 74 68 65 72  emory) then ther
5040: 65 20 69 73 20 6e 6f 20 70 65 6e 64 69 6e 67 20  e is no pending 
5050: 62 79 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  byte..*/.#ifdef 
5060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
5070: 49 4f 0a 23 20 64 65 66 69 6e 65 20 50 45 4e 44  IO.# define PEND
5080: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
5090: 74 29 20 20 30 78 37 66 66 66 66 66 66 66 0a 23  t)  0x7fffffff.#
50a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 45  else.# define PE
50b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
50c0: 70 42 74 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  pBt) ((PENDING_B
50d0: 59 54 45 2f 28 70 42 74 29 2d 3e 70 61 67 65 53  YTE/(pBt)->pageS
50e0: 69 7a 65 29 2b 31 29 0a 23 65 6e 64 69 66 0a 0a  ize)+1).#endif..
50f0: 2f 2a 0a 2a 2a 20 41 20 6c 69 6e 6b 65 64 20 6c  /*.** A linked l
5100: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
5110: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73 20  wing structures 
5120: 69 73 20 73 74 6f 72 65 64 20 61 74 20 42 74 53  is stored at BtS
5130: 68 61 72 65 64 2e 70 4c 6f 63 6b 2e 0a 2a 2a 20  hared.pLock..** 
5140: 4c 6f 63 6b 73 20 61 72 65 20 61 64 64 65 64 20  Locks are added 
5150: 28 6f 72 20 75 70 67 72 61 64 65 64 20 66 72 6f  (or upgraded fro
5160: 6d 20 52 45 41 44 5f 4c 4f 43 4b 20 74 6f 20 57  m READ_LOCK to W
5170: 52 49 54 45 5f 4c 4f 43 4b 29 20 77 68 65 6e 20  RITE_LOCK) when 
5180: 61 20 63 75 72 73 6f 72 20 0a 2a 2a 20 69 73 20  a cursor .** is 
5190: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 74 61  opened on the ta
51a0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ble with root pa
51b0: 67 65 20 42 74 53 68 61 72 65 64 2e 69 54 61 62  ge BtShared.iTab
51c0: 6c 65 2e 20 4c 6f 63 6b 73 20 61 72 65 20 72 65  le. Locks are re
51d0: 6d 6f 76 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  moved.** from th
51e0: 69 73 20 6c 69 73 74 20 77 68 65 6e 20 61 20 74  is list when a t
51f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
5200: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5210: 64 20 62 61 63 6b 2c 20 6f 72 20 77 68 65 6e 0a  d back, or when.
5220: 2a 2a 20 61 20 62 74 72 65 65 20 68 61 6e 64 6c  ** a btree handl
5230: 65 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  e is closed..*/.
5240: 73 74 72 75 63 74 20 42 74 4c 6f 63 6b 20 7b 0a  struct BtLock {.
5250: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
5260: 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
5270: 20 68 61 6e 64 6c 65 20 68 6f 6c 64 69 6e 67 20   handle holding 
5280: 74 68 69 73 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50  this lock */.  P
5290: 67 6e 6f 20 69 54 61 62 6c 65 3b 20 20 20 20 20  gno iTable;     
52a0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
52b0: 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20  e of table */.  
52c0: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
52d0: 20 20 20 20 20 20 2f 2a 20 52 45 41 44 5f 4c 4f        /* READ_LO
52e0: 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b  CK or WRITE_LOCK
52f0: 20 2a 2f 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4e   */.  BtLock *pN
5300: 65 78 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ext;        /* N
5310: 65 78 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e  ext in BtShared.
5320: 70 4c 6f 63 6b 20 6c 69 73 74 20 2a 2f 0a 7d 3b  pLock list */.};
5330: 0a 0a 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 76  ../* Candidate v
5340: 61 6c 75 65 73 20 66 6f 72 20 42 74 4c 6f 63 6b  alues for BtLock
5350: 2e 65 4c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e  .eLock */.#defin
5360: 65 20 52 45 41 44 5f 4c 4f 43 4b 20 20 20 20 20  e READ_LOCK     
5370: 31 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f  1.#define WRITE_
5380: 4c 4f 43 4b 20 20 20 20 32 0a 0a 23 69 66 64 65  LOCK    2..#ifde
5390: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
53a0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
53b0: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
53c0: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
53d0: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
53e0: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
53f0: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
5400: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
5410: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
5420: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
5430: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
5440: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
5450: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
5460: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
5470: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
5480: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
5490: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
54a0: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
54b0: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
54c0: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
54d0: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
54e0: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
54f0: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
5500: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
5510: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
5520: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
5530: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
5540: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
5550: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
5560: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
5570: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
5580: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
5590: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
55a0: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
55b0: 54 61 62 6c 65 73 28 61 29 0a 23 65 6c 73 65 0a  Tables(a).#else.
55c0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
55d0: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
55e0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
55f0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
5600: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
5610: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
5620: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
5630: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5640: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
5650: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
5660: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
5670: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
5680: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
5690: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
56a0: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
56b0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
56c0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
56d0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
56e0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
56f0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
5700: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
5710: 65 72 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69  er;..  /* This i
5720: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
5730: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
5740: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
5750: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
5760: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
5770: 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64 44  ly()->useSharedD
5780: 61 74 61 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ata ){.    retur
5790: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
57a0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f  ..  /* This (alo
57b0: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c  ng with lockTabl
57c0: 65 28 29 29 20 69 73 20 77 68 65 72 65 20 74 68  e()) is where th
57d0: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
57e0: 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64  d flag is.  ** d
57f0: 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68  ealt with. If th
5800: 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72  e caller is quer
5810: 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d  ying for a read-
5820: 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61  lock and the fla
5830: 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69  g is.  ** set, i
5840: 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  t is uncondition
5850: 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65  ally granted - e
5860: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
5870: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a   write-locks.  *
5880: 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  * on the table. 
5890: 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  If a write-lock 
58a0: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
58b0: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
58c0: 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e  d flag.  ** is n
58d0: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20  ot considered.. 
58e0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63   **.  ** In func
58f0: 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29  tion lockTable()
5900: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
5910: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
5920: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
5930: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
5940: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
5950: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
5960: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
5970: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
5980: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
5990: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
59a0: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
59b0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
59c0: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
59d0: 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72  s do.  ** not cr
59e0: 65 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20  eate or respect 
59f0: 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65  table locks. The
5a00: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75   locking procedu
5a10: 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77  re for a .  ** w
5a20: 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73  rite-cursor does
5a30: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a   not change..  *
5a40: 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 21 70 2d  /.  if( .    !p-
5a50: 3e 70 53 71 6c 69 74 65 20 7c 7c 20 0a 20 20 20  >pSqlite || .   
5a60: 20 30 3d 3d 28 70 2d 3e 70 53 71 6c 69 74 65 2d   0==(p->pSqlite-
5a70: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
5a80: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
5a90: 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52  | .    eLock==WR
5aa0: 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20  ITE_LOCK ||.    
5ab0: 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f  iTab==MASTER_ROO
5ac0: 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  T.  ){.    for(p
5ad0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
5ae0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
5af0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
5b00: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
5b10: 74 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72  tree!=p && pIter
5b20: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26  ->iTable==iTab &
5b30: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
5b40: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
5b50: 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44  k || eLock!=READ
5b60: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
5b70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5b80: 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
5b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5ba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5bb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63  ./*.** Add a loc
5bc0: 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77  k on the table w
5bd0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
5be0: 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72  able to the shar
5bf0: 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a  ed-btree used.**
5c00: 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65   by Btree handle
5c10: 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c   p. Parameter eL
5c20: 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68  ock must be eith
5c30: 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  er READ_LOCK or 
5c40: 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a  .** WRITE_LOCK..
5c50: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
5c60: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
5c70: 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64  he lock is added
5c80: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
5c90: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a  QLITE_BUSY and.*
5ca0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d  * SQLITE_NOMEM m
5cb0: 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72  ay also be retur
5cc0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
5cd0: 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72  nt lockTable(Btr
5ce0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
5cf0: 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  le, u8 eLock){. 
5d00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
5d10: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
5d20: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  k *pLock = 0;.  
5d30: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
5d40: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
5d50: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
5d60: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
5d70: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
5d80: 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61   0==sqlite3Threa
5d90: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
5da0: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
5db0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5dc0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
5dd0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b  ssert( SQLITE_OK
5de0: 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  ==queryTableLock
5df0: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
5e00: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
5e10: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
5e20: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
5e30: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
5e40: 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a 20 20  is requested,.  
5e50: 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20  ** return early 
5e60: 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61  without adding a
5e70: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42  n entry to the B
5e80: 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69  tShared.pLock li
5e90: 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d  st. See.  ** com
5ea0: 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ment in function
5eb0: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
5ec0: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20  ) for more info 
5ed0: 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a  on handling .  *
5ee0: 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  * the ReadUncomm
5ef0: 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f  itted flag..  */
5f00: 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e  .  if( .    (p->
5f10: 70 53 71 6c 69 74 65 29 20 26 26 20 0a 20 20 20  pSqlite) && .   
5f20: 20 28 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c   (p->pSqlite->fl
5f30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
5f40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a  ncommitted) && .
5f50: 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44      (eLock==READ
5f60: 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54  _LOCK) &&.    iT
5f70: 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f  able!=MASTER_ROO
5f80: 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T.  ){.    retur
5f90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5fa0: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61  ..  /* First sea
5fb0: 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72  rch the list for
5fc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63   an existing loc
5fd0: 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  k on this table.
5fe0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   */.  for(pIter=
5ff0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
6000: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
6010: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6020: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
6030: 54 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e  Table && pIter->
6040: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
6050: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72     pLock = pIter
6060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6070: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
6080: 66 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72  f the above sear
6090: 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  ch did not find 
60a0: 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20  a BtLock struct 
60b0: 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65  associating Btre
60c0: 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61  e p.  ** with ta
60d0: 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f  ble iTable, allo
60e0: 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e  cate one and lin
60f0: 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  k it into the li
6100: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  st..  */.  if( !
6110: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
6120: 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73  ck = (BtLock *)s
6130: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
6140: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
6150: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
6160: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6170: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6180: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
6190: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
61a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
61b0: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
61c0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
61d0: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
61e0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
61f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
6200: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
6210: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
6220: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
6230: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
6240: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
6250: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
6260: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
6270: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
6280: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
6290: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
62a0: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
62b0: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
62c0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
62d0: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
62e0: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
62f0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
6300: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
6310: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
6320: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
6330: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6340: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
6350: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
6360: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
6370: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74  d via calls to t
6380: 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a  he lockTable().*
6390: 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  * procedure) hel
63a0: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
63b0: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
63c0: 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  oid unlockAllTab
63d0: 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  les(Btree *p){. 
63e0: 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72   BtLock **ppIter
63f0: 20 3d 20 26 70 2d 3e 70 42 74 2d 3e 70 4c 6f 63   = &p->pBt->pLoc
6400: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  k;..  /* If the 
6410: 73 68 61 72 65 64 2d 63 61 63 68 65 20 65 78 74  shared-cache ext
6420: 65 6e 73 69 6f 6e 20 69 73 20 6e 6f 74 20 65 6e  ension is not en
6430: 61 62 6c 65 64 2c 20 74 68 65 72 65 20 73 68 6f  abled, there sho
6440: 75 6c 64 20 62 65 20 6e 6f 0a 20 20 2a 2a 20 6c  uld be no.  ** l
6450: 6f 63 6b 73 20 69 6e 20 74 68 65 20 42 74 53 68  ocks in the BtSh
6460: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2c  ared.pLock list,
6470: 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 70 72 6f   making this pro
6480: 63 65 64 75 72 65 20 61 20 6e 6f 2d 6f 70 2e 20  cedure a no-op. 
6490: 41 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74  Assert.  ** that
64a0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
64b0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
64c0: 28 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  ( sqlite3ThreadD
64d0: 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75  ataReadOnly()->u
64e0: 73 65 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20  seSharedData || 
64f0: 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20  0==*ppIter );.. 
6500: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
6510: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
6520: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
6530: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
6540: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
6550: 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63    *ppIter = pLoc
6560: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
6570: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b  sqliteFree(pLock
6580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6590: 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c      ppIter = &pL
65a0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
65b0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
65c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
65d0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
65e0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
65f0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
6600: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
6610: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
6620: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
6630: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
6640: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
6650: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
6660: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
6670: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
6680: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
6690: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
66a0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
66b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
66c0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
66d0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
66e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
66f0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
6700: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
6710: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
6720: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
6730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6740: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
6750: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
6760: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6770: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
6780: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
6790: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
67a0: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
67b0: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
67c0: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
67d0: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
67e0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
67f0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
6800: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
6810: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
6820: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
6830: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
6840: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
6850: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
6860: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
6870: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
6880: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
6890: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
68a0: 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70 50  K && 0==pCur->pP
68b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20  age->intKey){.  
68c0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
68d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70 43 75 72  qliteMalloc(pCur
68e0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  ->nKey);.    if(
68f0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72   pKey ){.      r
6900: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6910: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75  Key(pCur, 0, pCu
6920: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
6930: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6950: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6960: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
6970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6980: 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  eFree(pKey);.   
6990: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
69a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
69b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
69c0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
69d0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
69e0: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
69f0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
6a00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6a10: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
6a20: 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
6a30: 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20  ur->pPage = 0;. 
6a40: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6a50: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
6a60: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  SEEK;.  }..  ret
6a70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6a80: 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
6a90: 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f  ons of all curso
6aa0: 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65 70  rs except pExcep
6ab0: 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61  t open on the ta
6ac0: 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f  ble .** with roo
6ad0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73  t-page iRoot. Us
6ae0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63  ually, this is c
6af0: 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72  alled just befor
6b00: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63  e cursor.** pExc
6b10: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
6b20: 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20  odify the table 
6b30: 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f  (BtreeDelete() o
6b40: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29  r BtreeInsert())
6b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b60: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
6b70: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6b80: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
6b90: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
6ba0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
6bb0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
6bc0: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
6bd0: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
6be0: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
6bf0: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
6c00: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
6c10: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
6c20: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
6c30: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
6c40: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6c50: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
6c60: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6c70: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6c80: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
6c90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6ca0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6cb0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
6cc0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
6cd0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
6ce0: 20 76 6f 69 64 20 63 6c 65 61 72 43 75 72 73 6f   void clearCurso
6cf0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6d00: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 73 71 6c  or *pCur){.  sql
6d10: 69 74 65 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  iteFree(pCur->pK
6d20: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
6d30: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
6d40: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
6d50: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
6d60: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
6d70: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
6d80: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
6d90: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
6da0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
6db0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
6dc0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
6dd0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
6de0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
6df0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
6e00: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
6e10: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
6e20: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
6e30: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
6e40: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
6e50: 74 69 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c  tive restoreOrCl
6e60: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
6e70: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6e80: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6e90: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a  orPosition()..**
6ea0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
6eb0: 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d  d argument argum
6ec0: 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69  ent - doSeek - i
6ed0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  s false, then in
6ee0: 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74  stead of .** ret
6ef0: 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  urning the curso
6f00: 72 20 74 6f 20 69 74 27 73 20 73 61 76 65 64 20  r to it's saved 
6f10: 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61  position, any sa
6f20: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 73 20  ved position is 
6f30: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74  deleted.** and t
6f40: 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
6f50: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e  set to CURSOR_IN
6f60: 56 41 4c 49 44 2e 0a 2a 2f 0a 73 74 61 74 69 63  VALID..*/.static
6f70: 20 69 6e 74 20 72 65 73 74 6f 72 65 4f 72 43 6c   int restoreOrCl
6f80: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
6f90: 6e 58 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nX(BtCursor *pCu
6fa0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6fb0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6fc0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
6fd0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 70 43  UIRESEEK );.  pC
6fe0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6ff0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
7000: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
7010: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
7020: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
7030: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
7040: 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  kip);.  if( rc==
7050: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7060: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75 72   sqliteFree(pCur
7070: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
7080: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
7090: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
70a0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
70b0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
70c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
70d0: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
70e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
70f0: 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ne restoreOrClea
7100: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
7110: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7120: 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
7130: 45 53 45 45 4b 3f 72 65 73 74 6f 72 65 4f 72 43  ESEEK?restoreOrC
7140: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
7150: 6f 6e 58 28 70 29 3a 53 51 4c 49 54 45 5f 4f 4b  onX(p):SQLITE_OK
7160: 29 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  )..#ifndef SQLIT
7170: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7180: 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 6d 61  M./*.** These ma
7190: 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20  cros define the 
71a0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
71b0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
71c0: 79 20 66 6f 72 20 61 20 0a 2a 2a 20 64 61 74 61  y for a .** data
71d0: 62 61 73 65 20 70 61 67 65 2e 20 54 68 65 20 66  base page. The f
71e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
71f0: 20 65 61 63 68 20 69 73 20 74 68 65 20 6e 75 6d   each is the num
7200: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 0a 2a 2a  ber of usable.**
7210: 20 62 79 74 65 73 20 6f 6e 20 65 61 63 68 20 70   bytes on each p
7220: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
7230: 61 73 65 20 28 6f 66 74 65 6e 20 31 30 32 34 29  ase (often 1024)
7240: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 69 73 20  . The second is 
7250: 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
7260: 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 69 6e  er to look up in
7270: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7280: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 50  ..**.** PTRMAP_P
7290: 41 47 45 4e 4f 20 72 65 74 75 72 6e 73 20 74 68  AGENO returns th
72a0: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
72b0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 6f  number of the po
72c0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 70 61 67  inter-map.** pag
72d0: 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  e that stores th
72e0: 65 20 72 65 71 75 69 72 65 64 20 70 6f 69 6e 74  e required point
72f0: 65 72 2e 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  er. PTRMAP_PTROF
7300: 46 53 45 54 20 72 65 74 75 72 6e 73 0a 2a 2a 20  FSET returns.** 
7310: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7320: 65 20 72 65 71 75 65 73 74 65 64 20 6d 61 70 20  e requested map 
7330: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  entry..**.** If 
7340: 74 68 65 20 70 67 6e 6f 20 61 72 67 75 6d 65 6e  the pgno argumen
7350: 74 20 70 61 73 73 65 64 20 74 6f 20 50 54 52 4d  t passed to PTRM
7360: 41 50 5f 50 41 47 45 4e 4f 20 69 73 20 61 20 70  AP_PAGENO is a p
7370: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
7380: 0a 2a 2a 20 74 68 65 6e 20 70 67 6e 6f 20 69 73  .** then pgno is
7390: 20 72 65 74 75 72 6e 65 64 2e 20 53 6f 20 28 70   returned. So (p
73a0: 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
73b0: 4e 4f 28 70 67 73 7a 2c 20 70 67 6e 6f 29 29 20  NO(pgsz, pgno)) 
73c0: 63 61 6e 20 62 65 0a 2a 2a 20 75 73 65 64 20 74  can be.** used t
73d0: 6f 20 74 65 73 74 20 69 66 20 70 67 6e 6f 20 69  o test if pgno i
73e0: 73 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  s a pointer-map 
73f0: 70 61 67 65 2e 20 50 54 52 4d 41 50 5f 49 53 50  page. PTRMAP_ISP
7400: 41 47 45 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  AGE implements.*
7410: 2a 20 74 68 69 73 20 74 65 73 74 2e 0a 2a 2f 0a  * this test..*/.
7420: 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50 5f 50  #define PTRMAP_P
7430: 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 29  AGENO(pBt, pgno)
7440: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 70 42   ptrmapPageno(pB
7450: 74 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  t, pgno).#define
7460: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
7470: 54 28 70 42 74 2c 20 70 67 6e 6f 29 20 28 35 2a  T(pBt, pgno) (5*
7480: 28 70 67 6e 6f 2d 70 74 72 6d 61 70 50 61 67 65  (pgno-ptrmapPage
7490: 6e 6f 28 70 42 74 2c 20 70 67 6e 6f 29 2d 31 29  no(pBt, pgno)-1)
74a0: 29 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  ).#define PTRMAP
74b0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
74c0: 6f 29 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e  o) (PTRMAP_PAGEN
74d0: 4f 28 28 70 42 74 29 2c 28 70 67 6e 6f 29 29 3d  O((pBt),(pgno))=
74e0: 3d 28 70 67 6e 6f 29 29 0a 0a 73 74 61 74 69 63  =(pgno))..static
74f0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
7500: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
7510: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7520: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
7530: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
7540: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
7550: 69 6e 74 20 69 50 74 72 4d 61 70 20 3d 20 28 70  int iPtrMap = (p
7560: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7570: 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  MapPage;.  int r
7580: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
7590: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
75a0: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
75b0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
75c0: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
75d0: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
75e0: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
75f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7600: 20 69 73 20 61 20 6c 6f 6f 6b 75 70 20 74 61 62   is a lookup tab
7610: 6c 65 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  le that identifi
7620: 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
7630: 67 65 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 63  ge for.** each c
7640: 68 69 6c 64 20 70 61 67 65 20 69 6e 20 74 68 65  hild page in the
7650: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7660: 20 54 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   The parent page
7670: 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
7680: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  t.** contains a 
7690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
76a0: 68 69 6c 64 2e 20 20 45 76 65 72 79 20 70 61 67  hild.  Every pag
76b0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
76c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 30 20  e contains.** 0 
76d0: 6f 72 20 31 20 70 61 72 65 6e 74 20 70 61 67 65  or 1 parent page
76e0: 73 2e 20 20 28 49 6e 20 74 68 69 73 20 63 6f 6e  s.  (In this con
76f0: 74 65 78 74 20 27 64 61 74 61 62 61 73 65 20 70  text 'database p
7700: 61 67 65 27 20 72 65 66 65 72 73 0a 2a 2a 20 74  age' refers.** t
7710: 6f 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  o any page that 
7720: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 74  is not part of t
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
7740: 74 73 65 6c 66 2e 29 20 20 45 61 63 68 20 70 6f  tself.)  Each po
7750: 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 65 6e 74  inter map.** ent
7760: 72 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ry consists of a
7770: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 27 74 79   single byte 'ty
7780: 70 65 27 20 61 6e 64 20 61 20 34 20 62 79 74 65  pe' and a 4 byte
7790: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
77a0: 62 65 72 2e 0a 2a 2a 20 54 68 65 20 50 54 52 4d  ber..** The PTRM
77b0: 41 50 5f 58 58 58 20 69 64 65 6e 74 69 66 69 65  AP_XXX identifie
77c0: 72 73 20 62 65 6c 6f 77 20 61 72 65 20 74 68 65  rs below are the
77d0: 20 76 61 6c 69 64 20 74 79 70 65 73 2e 0a 2a 2a   valid types..**
77e0: 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20  .** The purpose 
77f0: 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  of the pointer m
7800: 61 70 20 69 73 20 74 6f 20 66 61 63 69 6c 69 74  ap is to facilit
7810: 79 20 6d 6f 76 69 6e 67 20 70 61 67 65 73 20 66  y moving pages f
7820: 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 70 6f 73 69 74  rom one.** posit
7830: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ion in the file 
7840: 74 6f 20 61 6e 6f 74 68 65 72 20 61 73 20 70 61  to another as pa
7850: 72 74 20 6f 66 20 61 75 74 6f 76 61 63 75 75 6d  rt of autovacuum
7860: 2e 20 20 57 68 65 6e 20 61 20 70 61 67 65 0a 2a  .  When a page.*
7870: 2a 20 69 73 20 6d 6f 76 65 64 2c 20 74 68 65 20  * is moved, the 
7880: 70 6f 69 6e 74 65 72 20 69 6e 20 69 74 73 20 70  pointer in its p
7890: 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 75 70  arent must be up
78a0: 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  dated to point t
78b0: 6f 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 6f 63  o the.** new loc
78c0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 6f 69 6e  ation.  The poin
78d0: 74 65 72 20 6d 61 70 20 69 73 20 75 73 65 64 20  ter map is used 
78e0: 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 70 61  to locate the pa
78f0: 72 65 6e 74 20 70 61 67 65 20 71 75 69 63 6b 6c  rent page quickl
7900: 79 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  y..**.** PTRMAP_
7910: 52 4f 4f 54 50 41 47 45 3a 20 54 68 65 20 64 61  ROOTPAGE: The da
7920: 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61  tabase page is a
7930: 20 72 6f 6f 74 2d 70 61 67 65 2e 20 54 68 65 20   root-page. The 
7940: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
7950: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ot.**           
7960: 20 20 20 20 20 20 20 75 73 65 64 20 69 6e 20 74         used in t
7970: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
7980: 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 3a  PTRMAP_FREEPAGE:
7990: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 70 61   The database pa
79a0: 67 65 20 69 73 20 61 6e 20 75 6e 75 73 65 64 20  ge is an unused 
79b0: 28 66 72 65 65 29 20 70 61 67 65 2e 20 54 68 65  (free) page. The
79c0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 0a 2a 2a   page-number .**
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e    is not used in
79f0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
7a00: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
7a10: 57 31 3a 20 54 68 65 20 64 61 74 61 62 61 73 65  W1: The database
7a20: 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
7a30: 73 74 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73  st page in a lis
7a40: 74 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 20  t of .**        
7a50: 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
7a60: 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
7a70: 61 67 65 20 6e 75 6d 62 65 72 20 69 64 65 6e 74  age number ident
7a80: 69 66 69 65 73 20 74 68 65 20 70 61 67 65 20 74  ifies the page t
7a90: 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
7aa0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e           contain
7ab0: 73 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  s the cell with 
7ac0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
7ad0: 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  s overflow page.
7ae0: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
7af0: 45 52 46 4c 4f 57 32 3a 20 54 68 65 20 64 61 74  ERFLOW2: The dat
7b00: 61 62 61 73 65 20 70 61 67 65 20 69 73 20 74 68  abase page is th
7b10: 65 20 73 65 63 6f 6e 64 20 6f 72 20 6c 61 74 65  e second or late
7b20: 72 20 70 61 67 65 20 69 6e 20 61 20 6c 69 73 74  r page in a list
7b30: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
7b40: 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
7b50: 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 61 67  w pages. The pag
7b60: 65 2d 6e 75 6d 62 65 72 20 69 64 65 6e 74 69 66  e-number identif
7b70: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
7b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7b90: 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 74 68        page in th
7ba0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
7bb0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  list..**.** PTRM
7bc0: 41 50 5f 42 54 52 45 45 3a 20 54 68 65 20 64 61  AP_BTREE: The da
7bd0: 74 61 62 61 73 65 20 70 61 67 65 20 69 73 20 61  tabase page is a
7be0: 20 6e 6f 6e 2d 72 6f 6f 74 20 62 74 72 65 65 20   non-root btree 
7bf0: 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 6e  page. The page n
7c00: 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
7c10: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
7c20: 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
7c30: 65 20 69 6e 20 74 68 65 20 62 74 72 65 65 2e 0a  e in the btree..
7c40: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41  */.#define PTRMA
7c50: 50 5f 52 4f 4f 54 50 41 47 45 20 31 0a 23 64 65  P_ROOTPAGE 1.#de
7c60: 66 69 6e 65 20 50 54 52 4d 41 50 5f 46 52 45 45  fine PTRMAP_FREE
7c70: 50 41 47 45 20 32 0a 23 64 65 66 69 6e 65 20 50  PAGE 2.#define P
7c80: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
7c90: 33 0a 23 64 65 66 69 6e 65 20 50 54 52 4d 41 50  3.#define PTRMAP
7ca0: 5f 4f 56 45 52 46 4c 4f 57 32 20 34 0a 23 64 65  _OVERFLOW2 4.#de
7cb0: 66 69 6e 65 20 50 54 52 4d 41 50 5f 42 54 52 45  fine PTRMAP_BTRE
7cc0: 45 20 35 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  E 5../*.** Write
7cd0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7ce0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
7cf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7d00: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7d10: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7d20: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7d30: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7d40: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7d50: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7d60: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7d70: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65   'pgno'..** An e
7d80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7d90: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
7da0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
7db0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
7dc0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
7dd0: 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  t ptrmapPut(BtSh
7de0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7df0: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
7e00: 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44  gno parent){.  D
7e10: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7e20: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7e30: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7e40: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
7e50: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7e60: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
7e70: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
7e80: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7e90: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
7ea0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7eb0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7ec0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7ed0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
7ee0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ef0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7f00: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7f10: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7f20: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7f30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7f40: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7f50: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7f60: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7f70: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7f80: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7f90: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
7fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7fb0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7fc0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7fd0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7fe0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7ff0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8000: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8010: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
8020: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8040: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
8050: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
8060: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50  (pBt, key);.  pP
8070: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
8080: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8090: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
80a0: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
80b0: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
80c0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
80d0: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
80e0: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
80f0: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
8100: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
8110: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
8120: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
8130: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
8140: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
8150: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8160: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
8170: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
8180: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
8190: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
81a0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
81b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
81c0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
81d0: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
81e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
81f0: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
8200: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
8210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8220: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
8230: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
8240: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
8250: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
8260: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
8270: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
8280: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8290: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
82a0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
82b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
82c0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
82d0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
82e0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
82f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8300: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
8310: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
8320: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
8330: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
8340: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
8350: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8360: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
8370: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
8380: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
8390: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
83a0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
83b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
83c0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
83d0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
83e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
83f0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
8400: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
8410: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
8420: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
8430: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
8440: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
8450: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
8460: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
8470: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8480: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8490: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
84a0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
84b0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
84c0: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
84d0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
84e0: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
84f0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
8500: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
8510: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8520: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8530: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8540: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8550: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8560: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8570: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
8580: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
85a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
85b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
85c0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
85d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
85e0: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
85f0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8600: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8610: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8620: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8630: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8640: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8650: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8660: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8670: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8680: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
86a0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
86b0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
86c0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
86d0: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
86e0: 75 38 20 2a 66 69 6e 64 43 65 6c 6c 28 4d 65 6d  u8 *findCell(Mem
86f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8700: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 64   iCell){.  u8 *d
8710: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
8720: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43  ta;.  assert( iC
8730: 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell>=0 );.  asse
8740: 72 74 28 20 69 43 65 6c 6c 3c 67 65 74 32 62 79  rt( iCell<get2by
8750: 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
8760: 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29 3b  hdrOffset+3]) );
8770: 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 20 2b  .  return data +
8780: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8790: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
87a0: 74 2b 32 2a 69 43 65 6c 6c 5d 29 3b 0a 7d 0a 0a  t+2*iCell]);.}..
87b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
87c0: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
87d0: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
87e0: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
87f0: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
8800: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
8810: 20 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73   cells.  See ins
8820: 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ert.*/.static u8
8830: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
8840: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
8850: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
8860: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
8870: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8880: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
8890: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
88a0: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
88b0: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
88c0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
88d0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
88e0: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
88f0: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
8900: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
8910: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8920: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
8930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8940: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
8950: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
8960: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
8970: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
8980: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8990: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
89a0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
89b0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
89c0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
89d0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
89e0: 6e 63 74 69 6f 6e 2e 20 20 70 61 72 73 65 43 65  nction.  parseCe
89f0: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 63 65 6c  ll() takes a cel
8a00: 6c 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  l index.** as th
8a10: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8a20: 74 20 61 6e 64 20 70 61 72 73 65 43 65 6c 6c 50  t and parseCellP
8a30: 74 72 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  tr() takes a poi
8a40: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 62  nter to the.** b
8a50: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
8a60: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
8a70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
8a80: 63 20 76 6f 69 64 20 70 61 72 73 65 43 65 6c 6c  c void parseCell
8a90: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
8aa0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
8ab0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
8ac0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
8ad0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
8af0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
8b00: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
8b10: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8b20: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8b30: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8b40: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8b60: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
8b70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
8b80: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
8b90: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
8ba0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
8bb0: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
8bc0: 61 64 20 2a 2f 0a 0a 20 20 70 49 6e 66 6f 2d 3e  ad */..  pInfo->
8bd0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
8be0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8bf0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
8c00: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
8c10: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
8c20: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
8c30: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
8c40: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
8c50: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
8c60: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
8c70: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
8c80: 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65  &nPayload);.  }e
8c90: 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
8ca0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  d = 0;.  }.  pIn
8cb0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
8cc0: 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67  load;.  if( pPag
8cd0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
8ce0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
8cf0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20  &pCell[n], (u64 
8d00: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
8d10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33  .  }else{.    u3
8d20: 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  2 x;.    n += ge
8d30: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
8d40: 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20 20 70 49  [n], &x);.    pI
8d50: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20  nfo->nKey = x;. 
8d60: 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78     nPayload += x
8d70: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8d80: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8d90: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
8da0: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
8db0: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
8dc0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
8dd0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
8de0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
8df0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
8e00: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
8e10: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
8e20: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
8e30: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
8e40: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
8e50: 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  int nSize;      
8e60: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
8e70: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
8e80: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  t in bytes */.  
8e90: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8ea0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
8eb0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8ec0: 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20   = 0;.    nSize 
8ed0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
8ee0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
8ef0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
8f00: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
8f10: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
8f20: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
8f30: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8f40: 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b   nSize;.  }else{
8f50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
8f60: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8f70: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8f80: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8f90: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
8fa0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
8fb0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
8fc0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
8fd0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
8fe0: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
8ff0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
9000: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
9010: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
9020: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
9030: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
9040: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
9050: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
9060: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
9070: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
9080: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
9090: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
90a0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
90b0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
90c0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
90d0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
90e0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
90f0: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
9100: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
9110: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
9120: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9130: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
9140: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
9150: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
9160: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
9170: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
9180: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
9190: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
91a0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
91b0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
91c0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
91d0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
91e0: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
91f0: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
9200: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
9210: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
9220: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
9230: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
9240: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
9250: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9260: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9270: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
9280: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9290: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
92a0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
92b0: 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  = surplus;.    }
92c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
92d0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c  o->nLocal = minL
92e0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
92f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
9300: 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   = pInfo->nLocal
9310: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
9320: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
9330: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
9340: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9350: 20 70 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65   parseCell(.  Me
9360: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9370: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9380: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9390: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
93a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
93b0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
93c0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
93d0: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
93e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
93f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9400: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9410: 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
9420: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
9430: 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49  Page, iCell), pI
9440: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
9450: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
9460: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9470: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
9480: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
9490: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
94a0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
94b0: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
94c0: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
94d0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
94e0: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
94f0: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
9500: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
9510: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
9520: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
9530: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
9540: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
9550: 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53  static int cellS
9560: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
9570: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
9580: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
9590: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
95a0: 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, iCell, &info
95b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
95c0: 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  .nSize;.}.#endif
95d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c  .static int cell
95e0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
95f0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9600: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
9610: 6e 66 6f 3b 0a 20 20 70 61 72 73 65 43 65 6c 6c  nfo;.  parseCell
9620: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
9630: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
9640: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
9650: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9660: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
9670: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
9680: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
9690: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
96a0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
96b0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
96c0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
96d0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
96e0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
96f0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
9700: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
9710: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
9720: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
9730: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
9740: 7b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b  {.  if( pCell ){
9750: 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
9760: 66 6f 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c  fo;.    parseCel
9770: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
9780: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
9790: 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
97a0: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
97b0: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
97c0: 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
97d0: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e  ;.    if( (info.
97e0: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
97f0: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
9800: 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
9810: 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66  {.      Pgno ovf
9820: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
9830: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
9840: 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ow]);.      retu
9850: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
9860: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9870: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9880: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
9890: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
98a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
98b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
98c0: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
98d0: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
98e0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
98f0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
9900: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
9910: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
9920: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
9930: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
9940: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
9950: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
9960: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
9970: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
9980: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
9990: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
99a0: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
99b0: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
99c0: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
99d0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
99e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ;.}.#endif.../* 
99f0: 41 20 62 75 6e 63 68 20 6f 66 20 61 73 73 65 72  A bunch of asser
9a00: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
9a10: 6f 20 63 68 65 63 6b 20 74 68 65 20 74 72 61 6e  o check the tran
9a20: 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 76 61  saction state va
9a30: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 68 61  riables.** of ha
9a40: 6e 64 6c 65 20 70 20 28 74 79 70 65 20 42 74 72  ndle p (type Btr
9a50: 65 65 2a 29 20 61 72 65 20 69 6e 74 65 72 6e 61  ee*) are interna
9a60: 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
9a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 62 74 72 65 65  */.#define btree
9a80: 49 6e 74 65 67 72 69 74 79 28 70 29 20 5c 0a 20  Integrity(p) \. 
9a90: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
9aa0: 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
9ab0: 7c 7c 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  || p->pBt->nTran
9ac0: 73 61 63 74 69 6f 6e 3c 70 2d 3e 70 42 74 2d 3e  saction<p->pBt->
9ad0: 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73 73 65  nRef ); \.  asse
9ae0: 72 74 28 20 70 2d 3e 70 42 74 2d 3e 6e 54 72 61  rt( p->pBt->nTra
9af0: 6e 73 61 63 74 69 6f 6e 3c 3d 70 2d 3e 70 42 74  nsaction<=p->pBt
9b00: 2d 3e 6e 52 65 66 20 29 3b 20 5c 0a 20 20 61 73  ->nRef ); \.  as
9b10: 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 69 6e  sert( p->pBt->in
9b20: 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
9b30: 4e 53 5f 4e 4f 4e 45 20 7c 7c 20 70 2d 3e 70 42  NS_NONE || p->pB
9b40: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
9b50: 3d 30 20 29 3b 20 5c 0a 20 20 61 73 73 65 72 74  =0 ); \.  assert
9b60: 28 20 70 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  ( p->pBt->inTran
9b70: 73 61 63 74 69 6f 6e 3e 3d 70 2d 3e 69 6e 54 72  saction>=p->inTr
9b80: 61 6e 73 20 29 3b 20 0a 0a 2f 2a 0a 2a 2a 20 44  ans ); ../*.** D
9b90: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
9ba0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
9bb0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
9bc0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
9bd0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
9be0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
9bf0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
9c00: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
9c10: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
9c20: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
9c30: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
9c40: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
9c50: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9c60: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
9c70: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
9c80: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
9c90: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9cc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
9cf0: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
9d00: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d20: 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
9d30: 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20  byte after cell 
9d40: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
9d50: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
9d80: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
9d90: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
9da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9db0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
9dc0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
9dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9de0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
9df0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
9e00: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
9e10: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
9e20: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
9e30: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9e40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 72  rray */.  int br
9e50: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9e60: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9e70: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
9e80: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
9e90: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
9ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9eb0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
9ec0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
9ed0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
9ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
9ef0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
9f00: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
9f10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
9f20: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
9f30: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
9f40: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9f50: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9f60: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9f70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9f80: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
9f90: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
9fa0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
9fb0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
9fc0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
9fd0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9fe0: 3d 3d 30 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ==0 );.  temp = 
9ff0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
a000: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
a010: 7a 65 20 29 3b 0a 20 20 69 66 28 20 74 65 6d 70  ze );.  if( temp
a020: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
a030: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 64 61 74  ITE_NOMEM;.  dat
a040: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a050: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
a060: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
a070: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a080: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a090: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
a0a0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
a0b0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
a0c0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
a0d0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
a0e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a0f0: 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20  leSize;.  brk = 
a100: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a110: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
a120: 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61  (&temp[brk], &da
a130: 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  ta[brk], usableS
a140: 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72  ize - brk);.  br
a150: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
a160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
a170: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
a180: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
a190: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
a1a0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
a1b0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
a1c0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
a1d0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
a1e0: 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65  pAddr);.    asse
a1f0: 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42  rt( pc<pPage->pB
a200: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
a210: 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c  .    size = cell
a220: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
a230: 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62  temp[pc]);.    b
a240: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
a250: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b  memcpy(&data[brk
a260: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
a270: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
a280: 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20  e(pAddr, brk);. 
a290: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b   }.  assert( brk
a2a0: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
a2b0: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
a2c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a2d0: 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64   brk);.  data[hd
a2e0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
a2f0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
a300: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a310: 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66    addr = cellOff
a320: 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d  set+2*nCell;.  m
a330: 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72  emset(&data[addr
a340: 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b  ], 0, brk-addr);
a350: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 74 65  .  sqliteFree(te
a360: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mp);.  return SQ
a370: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a380: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
a390: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
a3a0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
a3b0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
a3c0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
a3d0: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
a3e0: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
a3f0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
a400: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
a410: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
a420: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
a430: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
a440: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
a450: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
a460: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
a470: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
a480: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
a490: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
a4a0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
a4b0: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
a4c0: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
a4d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
a4e0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
a4f0: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
a500: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
a510: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
a520: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
a530: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
a540: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
a550: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
a560: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
a570: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
a580: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
a590: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
a5a0: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
a5b0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
a5c0: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
a5d0: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
a5e0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
a5f0: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
a600: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
a610: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
a620: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
a630: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
a640: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a650: 70 42 74 20 29 3b 0a 20 20 69 66 28 20 6e 42 79  pBt );.  if( nBy
a660: 74 65 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34  te<4 ) nByte = 4
a670: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
a680: 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50  Free<nByte || pP
a690: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
a6a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
a6b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e  Page->nFree -= n
a6c0: 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50  Byte;.  hdr = pP
a6d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a6e0: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
a6f0: 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46  hdr+7];.  if( nF
a700: 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a  rag<60 ){.    /*
a710: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
a720: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
a730: 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75   a slot big enou
a740: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
a750: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72  e.    ** space r
a760: 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61  equest. */.    a
a770: 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20  ddr = hdr+1;.   
a780: 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65   while( (pc = ge
a790: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a7a0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  r]))>0 ){.      
a7b0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a7c0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
a7d0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
a7e0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
a7f0: 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20  f( size<nByte+4 
a800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
a810: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
a820: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
a830: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
a840: 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20  dr+7] = nFrag + 
a850: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
a860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
a870: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
a880: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  {.          put2
a890: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
a8a0: 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20  , size-nByte);. 
a8b0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a8c0: 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  pc + size - nByt
a8d0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
a8e0: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
a8f0: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
a900: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
a910: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
a920: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
a930: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
a940: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
a950: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
a960: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
a970: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a980: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
a990: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
a9a0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
a9b0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
a9c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
a9d0: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
a9e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
a9f0: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
aa00: 79 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64  yte ){.    if( d
aa10: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
aa20: 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  age) ) return 0;
aa30: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
aa40: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
aa50: 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20  );.  }.  top -= 
aa60: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
aa70: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
aa80: 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a  nCell <= top );.
aa90: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
aaa0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
aab0: 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a   return top;.}..
aac0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
aad0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
aae0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
aaf0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
ab00: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ab10: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
ab20: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
ab30: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
ab40: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
ab50: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
ab60: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
ab70: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
ab80: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
ab90: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
aba0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
abb0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
abc0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
abd0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
abe0: 76 6f 69 64 20 66 72 65 65 53 70 61 63 65 28 4d  void freeSpace(M
abf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ac00: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
ac10: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
ac20: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
ac30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
ac40: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
ac50: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
ac60: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ac70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ac80: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
ac90: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
aca0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
acb0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
acc0: 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
acd0: 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20  >leaf?0:4) );.  
ace0: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
acf0: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
ad00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
ad10: 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20 29  ;.  if( size<4 )
ad20: 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64   size = 4;..#ifd
ad30: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
ad40: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
ad50: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
ad60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
ad70: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
ad80: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
ad90: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
ada0: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
adb0: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
adc0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
add0: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
ade0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
adf0: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
ae00: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
ae10: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
ae20: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ae30: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
ae40: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
ae50: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
ae60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
ae70: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
ae80: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
ae90: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
aea0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
aeb0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73  Size-4 );.    as
aec0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
aed0: 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  r );.    addr = 
aee0: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73  pbegin;.  }.  as
aef0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
af00: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
af10: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65  Size-4 );.  asse
af20: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
af30: 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a  || pbegin==0 );.
af40: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
af50: 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a  [addr], start);.
af60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
af70: 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29  [start], pbegin)
af80: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
af90: 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a  ta[start+2], siz
afa0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
afb0: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f  ee += size;..  /
afc0: 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63  * Coalesce adjac
afd0: 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  ent free blocks 
afe0: 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67  */.  addr = pPag
aff0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31  e->hdrOffset + 1
b000: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
b010: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b020: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
b030: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
b040: 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  psize;.    asser
b050: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
b060: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
b070: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
b080: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
b090: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
b0a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b0b0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
b0c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b0d0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
b0e0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
b0f0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
b100: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
b110: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
b120: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
b130: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  +psize);.      a
b140: 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74  ssert( frag<=dat
b150: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
b160: 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64  et+7] );.      d
b170: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
b180: 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b  fset+7] -= frag;
b190: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
b1a0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67  &data[pbegin], g
b1b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
b1c0: 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75  ext]));.      pu
b1d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b1e0: 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65  gin+2], pnext+ge
b1f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
b200: 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a  xt+2])-pbegin);.
b210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b220: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
b230: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b240: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
b250: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
b260: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
b270: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
b280: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
b290: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
b2a0: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
b2b0: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
b2c0: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
b2d0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
b2e0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
b2f0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
b300: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
b310: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
b320: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
b330: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b340: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b350: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67  [hdr+5], top + g
b360: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
b370: 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d  egin+2]));.  }.}
b380: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
b390: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
b3a0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b3b0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
b3c0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
b3d0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
b3e0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
b3f0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
b400: 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ingly..*/.static
b410: 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61 67   void decodeFlag
b420: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
b430: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
b440: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b450: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
b460: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
b470: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b480: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
b490: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
b4a0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 70 50  100 : 0) );.  pP
b4b0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66  age->intKey = (f
b4c0: 6c 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49  lagByte & (PTF_I
b4d0: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
b4e0: 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  TA))!=0;.  pPage
b4f0: 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c  ->zeroData = (fl
b500: 61 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52  agByte & PTF_ZER
b510: 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61  ODATA)!=0;.  pPa
b520: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67  ge->leaf = (flag
b530: 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29  Byte & PTF_LEAF)
b540: 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  !=0;.  pPage->ch
b550: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28  ildPtrSize = 4*(
b560: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b  pPage->leaf==0);
b570: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
b580: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
b590: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41  yte & PTF_LEAFDA
b5a0: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
b5b0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20  >leafData = 1;. 
b5c0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
b5d0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
b5e0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
b5f0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b600: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nLeaf;.  }else{.
b610: 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44      pPage->leafD
b620: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b630: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b640: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b650: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b660: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b670: 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  l;.  }.  pPage->
b680: 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67  hasData = !(pPag
b690: 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28  e->zeroData || (
b6a0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20  !pPage->leaf && 
b6b0: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29  pPage->leafData)
b6c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
b6d0: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
b6e0: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
b6f0: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
b700: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  k..**.** The pPa
b710: 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d  rent parameter m
b720: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
b730: 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
b740: 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20  which.** is the 
b750: 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61  parent of the pa
b760: 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c  ge being initial
b770: 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20  ized.  The root 
b780: 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61  of a.** BTree ha
b790: 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20  s no parent and 
b7a0: 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  so for that page
b7b0: 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e  , pParent==NULL.
b7c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
b7d0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
b7e0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
b7f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
b800: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
b810: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
b820: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
b830: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
b840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
b850: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
b860: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
b870: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
b880: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
b890: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
b8a0: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
b8b0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
b8c0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
b8d0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
b8e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74  .static int init
b8f0: 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
b900: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  *pPage,        /
b910: 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
b920: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
b930: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
b940: 6e 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  nt       /* The 
b950: 70 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  parent.  Might b
b960: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
b970: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
b980: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b990: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b9a0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b9b0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  ] */.  int hdr; 
b9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b9d0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
b9e0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
b9f0: 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
ba00: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
ba10: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
ba20: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
ba30: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
ba40: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
ba50: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
ba60: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
ba70: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
ba80: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
ba90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
baa0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
bab0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
bac0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
bad0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
bae0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  r */.  int nFree
baf0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
bb00: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
bb10: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
bb20: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
bb30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bb40: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
bb50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
bb60: 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  /..  pBt = pPage
bb70: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
bb80: 20 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73   pBt!=0 );.  ass
bb90: 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20  ert( pParent==0 
bba0: 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d  || pParent->pBt=
bbb0: 3d 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  =pBt );.  assert
bbc0: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
bbd0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
bbe0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
bbf0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
bc00: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
bc10: 3d 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63  == &((unsigned c
bc20: 68 61 72 2a 29 70 50 61 67 65 29 5b 2d 70 42 74  har*)pPage)[-pBt
bc30: 2d 3e 70 61 67 65 53 69 7a 65 5d 20 29 3b 0a 20  ->pageSize] );. 
bc40: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
bc50: 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20  ent!=pParent && 
bc60: 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21  (pPage->pParent!
bc70: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49  =0 || pPage->isI
bc80: 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nit) ){.    /* T
bc90: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  he parent page s
bca0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e  hould never chan
bcb0: 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  ge unless the fi
bcc0: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f  le is corrupt */
bcd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bce0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bcf0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
bd00: 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ->isInit ) retur
bd10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
bd20: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
bd30: 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  t==0 && pParent!
bd40: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  =0 ){.    pPage-
bd50: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
bd60: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
bd70: 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
bd80: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
bd90: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
bda0: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
bdb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
bdc0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
bdd0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
bde0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
bdf0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
be00: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
be10: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
be20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
be30: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
be40: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
be50: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
be60: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
be70: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
be80: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
be90: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bea0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
beb0: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
bec0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
bed0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
bee0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
bef0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
bf00: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
bf10: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
bf20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bf40: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
bf50: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
bf60: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
bf70: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
bf80: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
bf90: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
bfa0: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
bfb0: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
bfc0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bfe0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
bff0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c000: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c010: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
c020: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c030: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
c040: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
c050: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
c060: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
c070: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
c080: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
c090: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
c0a0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
c0b0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
c0c0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
c0d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
c0e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c0f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c100: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
c110: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c120: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
c130: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c140: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
c150: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
c160: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
c170: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c180: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
c190: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
c1a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c1b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c1c0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
c1d0: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
c1e0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
c1f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c200: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
c210: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
c220: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
c230: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
c240: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
c250: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
c260: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c270: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
c280: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c2a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
c2b0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
c2c0: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
c2d0: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
c2e0: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
c2f0: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
c300: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
c310: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c320: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
c330: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c340: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
c350: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
c360: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
c370: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
c380: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c390: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
c3a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c3b0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c3c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c3d0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c3e0: 0a 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61  .  assert( &data
c3f0: 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 20  [pBt->pageSize] 
c400: 3d 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  == (unsigned cha
c410: 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r*)pPage );.  as
c420: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c430: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c440: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c450: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c460: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
c470: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
c480: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 66  .  data[hdr] = f
c490: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
c4a0: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
c4b0: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
c4c0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
c4d0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
c4e0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c4f0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
c500: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
c510: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
c520: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c530: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c540: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
c550: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
c560: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
c570: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
c580: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c590: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
c5a0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
c5b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 0;.  pPage->id
c5c0: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
c5d0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c5e0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c5f0: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
c600: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c610: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
c620: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
c630: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
c640: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
c650: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
c660: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
c670: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
c680: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
c690: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
c6a0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
c6b0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
c6c0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
c6d0: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
c6e0: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
c6f0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
c700: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
c710: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
c720: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
c730: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
c740: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
c750: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
c760: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
c770: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
c780: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
c790: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
c7a0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
c7b0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
c7c0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
c7d0: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
c7e0: 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 28  tic int getPage(
c7f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
c800: 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67  gno pgno, MemPag
c810: 65 20 2a 2a 70 70 50 61 67 65 2c 20 69 6e 74 20  e **ppPage, int 
c820: 6e 6f 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e  noContent){.  in
c830: 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
c840: 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61 67 65  *pPage;.  DbPage
c850: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 72 63   *pDbPage;..  rc
c860: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
c870: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
c880: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
c890: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
c8a0: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
c8b0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c8c0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
c8d0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
c8e0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
c8f0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
c900: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
c910: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
c920: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
c930: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
c940: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
c950: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
c960: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
c970: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
c980: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c990: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
c9a0: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
c9b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c9c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
c9d0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c9e0: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
c9f0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
ca00: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
ca10: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
ca20: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
ca30: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
ca40: 67 65 74 50 61 67 65 28 29 20 61 6e 64 20 69 6e  getPage() and in
ca50: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
ca60: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
ca70: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
ca80: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
ca90: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
caa0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
cab0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
cac0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
cad0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
cae0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
caf0: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
cb00: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
cb10: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
cb20: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
cb30: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
cb40: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
cb50: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 67 6e  nt rc;.  if( pgn
cb60: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
cb70: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
cb80: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72  T_BKPT; .  }.  r
cb90: 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
cba0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
cbb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
cbc0: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
cbd0: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
cbe0: 7b 0a 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50  {.    rc = initP
cbf0: 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61  age(*ppPage, pPa
cc00: 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rent);.  }.  ret
cc10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cc20: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
cc30: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
cc40: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
cc50: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
cc60: 2a 20 63 61 6c 6c 20 74 6f 20 67 65 74 50 61 67  * call to getPag
cc70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cc80: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
cc90: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
cca0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
ccb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ccc0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
ccd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
cce0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ccf0: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
cd00: 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
cd10: 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20 63  ze]==(unsigned c
cd20: 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  har*)pPage );.  
cd30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
cd40: 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
cd50: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
cd60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
cd70: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
cd80: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
cd90: 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  t for a page.** 
cda0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 57  reaches zero.  W
cdb0: 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66 20  e need to unref 
cdc0: 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e  the pParent poin
cdd0: 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a  ter when that.**
cde0: 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61   happens..*/.sta
cdf0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65 73  tic void pageDes
ce00: 74 72 75 63 74 6f 72 28 44 62 50 61 67 65 20 2a  tructor(DbPage *
ce10: 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53  pData, int pageS
ce20: 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ize){.  MemPage 
ce30: 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
ce40: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
ce50: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ==0 );.  pPage =
ce60: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
ce70: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ce80: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70  (pData);.  if( p
ce90: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Page->pParent ){
cea0: 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
ceb0: 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
cec0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50 61 67  Parent;.    pPag
ced0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
cee0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cef0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
cf00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cf10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  0;.}../*.** Duri
cf20: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
cf30: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
cf40: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
cf50: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
cf60: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
cf70: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
cf80: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
cf90: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
cfa0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
cfb0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
cfc0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
cfd0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
cfe0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
cff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
d000: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
d010: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
d020: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
d030: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
d040: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
d050: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
d060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
d070: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
d080: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
d090: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
d0a0: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
d0b0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
d0c0: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
d0d0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d0e0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d0f0: 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  a(pData);.  if( 
d100: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
d110: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d120: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 69 74  it = 0;.    init
d130: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
d140: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e->pParent);.  }
d150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d160: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d170: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d180: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d190: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d1a0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d1b0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65   is NULL.** a ne
d1c0: 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  w database with 
d1d0: 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73  a random name is
d1e0: 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20   created.  This 
d1f0: 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a  randomly named.*
d200: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
d210: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
d220: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
d230: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
d240: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
d250: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
d260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d270: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
d280: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
d290: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
d2a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
d2b0: 6c 69 74 65 33 20 2a 70 53 71 6c 69 74 65 2c 20  lite3 *pSqlite, 
d2c0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
d2d0: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
d2e0: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
d2f0: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
d300: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
d310: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
d320: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
d330: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
d340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
d350: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  ions */.){.  BtS
d360: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
d370: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
d380: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
d390: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
d3a0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
d3b0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
d3c0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
d3d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d3e0: 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b  .  int nReserve;
d3f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d400: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
d410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d430: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
d440: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d450: 44 49 53 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20  DISKIO).  const 
d460: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
d470: 72 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ro;.#endif..  /*
d480: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
d490: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
d4a0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
d4b0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
d4c0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
d4d0: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
d4e0: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
d4f0: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
d500: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
d510: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
d520: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
d530: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
d540: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
d550: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
d560: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
d570: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d580: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
d590: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d5a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d5b0: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
d5c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
d5d0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
d5e0: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
d5f0: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
d600: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
d610: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
d620: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
d630: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
d640: 0a 23 65 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73  .#endif..  p = s
d650: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
d660: 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
d670: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
d680: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d690: 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
d6a0: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
d6b0: 20 20 70 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70    p->pSqlite = p
d6c0: 53 71 6c 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72  Sqlite;..  /* Tr
d6d0: 79 20 74 6f 20 66 69 6e 64 20 61 6e 20 65 78 69  y to find an exi
d6e0: 73 74 69 6e 67 20 42 74 72 65 65 20 73 74 72 75  sting Btree stru
d6f0: 63 74 75 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20  cture opened on 
d700: 7a 46 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69  zFilename. */.#i
d710: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d720: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
d730: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
d740: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
d750: 4b 49 4f 29 0a 20 20 70 54 73 64 72 6f 20 3d 20  KIO).  pTsdro = 
d760: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
d770: 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69  aReadOnly();.  i
d780: 66 28 20 70 54 73 64 72 6f 2d 3e 75 73 65 53 68  f( pTsdro->useSh
d790: 61 72 65 64 44 61 74 61 20 26 26 20 7a 46 69 6c  aredData && zFil
d7a0: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
d7b0: 62 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  b ){.    char *z
d7c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
d7d0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
d7e0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
d7f0: 0a 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50  .    if( !zFullP
d800: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
d810: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
d820: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d830: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
d840: 0a 20 20 20 20 66 6f 72 28 70 42 74 3d 70 54 73  .    for(pBt=pTs
d850: 64 72 6f 2d 3e 70 42 74 72 65 65 3b 20 70 42 74  dro->pBtree; pBt
d860: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
d870: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d880: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
d890: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
d8a0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
d8b0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
d8c0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
d8d0: 67 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ger)) ){.       
d8e0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
d8f0: 20 20 20 20 20 20 20 2a 70 70 42 74 72 65 65 20         *ppBtree 
d900: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 42 74  = p;.        pBt
d910: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
d920: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
d930: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
d940: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d950: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
d960: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
d970: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
d980: 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  e);.  }.#endif..
d990: 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    /*.  ** The fo
d9a0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
d9b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
d9c0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
d9d0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
d9e0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
d9f0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
da00: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
da10: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
da20: 20 72 65 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65   result.  ** whe
da30: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
da40: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
da50: 74 65 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  tecture..  */.  
da60: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
da70: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
da80: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73  (i64)==4 );.  as
da90: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
daa0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
dab0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65  64)==4 );.  asse
dac0: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
dad0: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
dae0: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
daf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
db00: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a  of(Pgno)==4 );..
db10: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 4d 61    pBt = sqliteMa
db20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 42  lloc( sizeof(*pB
db30: 74 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 3d  t) );.  if( pBt=
db40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
db50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
db60: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
db70: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
db80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
db90: 6e 28 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  n(&pBt->pPager, 
dba0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41  zFilename, EXTRA
dbb0: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20  _SIZE, flags);. 
dbc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dbd0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
dbe0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
dbf0: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
dc00: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
dc10: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
dc20: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
dc30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dc40: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
dc50: 65 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 2d  en_out;.  }.  p-
dc60: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73  >pBt = pBt;..  s
dc70: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
dc80: 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70 50  structor(pBt->pP
dc90: 61 67 65 72 2c 20 70 61 67 65 44 65 73 74 72 75  ager, pageDestru
dca0: 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctor);.  sqlite3
dcb0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
dcc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
dcd0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 70 42 74  geReinit);.  pBt
dce0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
dcf0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
dd00: 3b 0a 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  ;.  pBt->readOnl
dd10: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
dd20: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
dd30: 70 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e  pPager);.  pBt->
dd40: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
dd50: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
dd60: 36 5d 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  6]);.  if( pBt->
dd70: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
dd80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
dd90: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
dda0: 5a 45 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 70  ZE.       || ((p
ddb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
ddc0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
ddd0: 30 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61  0 ){.    pBt->pa
dde0: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
ddf0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
de00: 45 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  E;.    pBt->maxE
de10: 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20 20  mbedFrac = 64;  
de20: 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20 70   /* 25% */.    p
de30: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
de40: 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35   = 32;   /* 12.5
de50: 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69  % */.    pBt->mi
de60: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
de70: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
de80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
de90: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dea0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
deb0: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
dec0: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
ded0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dee0: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ase, then.    **
def0: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
df00: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
df10: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
df20: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
df30: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
df40: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
df50: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
df60: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
df70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
df80: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
df90: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
dfa0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
dfb0: 75 73 74 20 61 0a 20 20 20 20 2a 2a 20 72 65 67  ust a.    ** reg
dfc0: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
dfd0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
dfe0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
dff0: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
e000: 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  al..    */.    i
e010: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
e020: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
e030: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e040: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
e050: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
e060: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70   1 : 0);.      p
e070: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
e080: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
e090: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
e0a0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 23   1 : 0);.    }.#
e0b0: 65 6e 64 69 66 0a 20 20 20 20 6e 52 65 73 65 72  endif.    nReser
e0c0: 76 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ve = 0;.  }else{
e0d0: 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
e0e0: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
e0f0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
e100: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
e110: 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  [21];.    pBt->m
e120: 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44  inEmbedFrac = zD
e130: 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20  bHeader[22];.   
e140: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
e150: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
e160: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  ];.    pBt->page
e170: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
e180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e190: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e1a0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
e1b0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
e1c0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
e1d0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
e1e0: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
e1f0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
e200: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
e210: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  e;.  assert( (pB
e220: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
e230: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
e240: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
e250: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 73 71 6c  ageSize */.  sql
e260: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
e270: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
e280: 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
e290: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
e2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
e2b0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
e2c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e2d0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 41  T_DISKIO).  /* A
e2e0: 64 64 20 74 68 65 20 6e 65 77 20 62 74 72 65 65  dd the new btree
e2f0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
e300: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
e310: 54 68 72 65 61 64 44 61 74 61 2e 70 42 74 72 65  ThreadData.pBtre
e320: 65 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73  e..  ** There is
e330: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
e340: 61 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 66  a malloc() may f
e350: 61 69 6c 20 69 6e 73 69 64 65 20 6f 66 20 74 68  ail inside of th
e360: 65 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 54  e .  ** sqlite3T
e370: 68 72 65 61 64 44 61 74 61 28 29 20 63 61 6c 6c  hreadData() call
e380: 2c 20 61 73 20 74 68 65 20 54 68 72 65 61 64 44  , as the ThreadD
e390: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 6d 75  ata structure mu
e3a0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  st have already.
e3b0: 20 20 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61    ** been alloca
e3c0: 74 65 64 20 66 6f 72 20 70 54 73 64 72 6f 2d 3e  ted for pTsdro->
e3d0: 75 73 65 53 68 61 72 65 64 44 61 74 61 20 74 6f  useSharedData to
e3e0: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20   be non-zero..  
e3f0: 2a 2f 0a 20 20 69 66 28 20 70 54 73 64 72 6f 2d  */.  if( pTsdro-
e400: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 26  >useSharedData &
e410: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  & zFilename && !
e420: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 70  isMemdb ){.    p
e430: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  Bt->pNext = pTsd
e440: 72 6f 2d 3e 70 42 74 72 65 65 3b 0a 20 20 20 20  ro->pBtree;.    
e450: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e460: 61 28 29 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  a()->pBtree = pB
e470: 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
e480: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
e490: 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
e4a0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
e4b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e4c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
e4d0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
e4e0: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
e4f0: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
e500: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
e510: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e520: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
e530: 46 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  Free(p);.    *pp
e540: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
e550: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e560: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
e570: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
e580: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
e590: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
e5a0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
e5b0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
e5c0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e5d0: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
e5e0: 20 2a 70 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66   *pCur;..#ifndef
e5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
e600: 52 45 44 5f 43 41 43 48 45 0a 20 20 54 68 72 65  RED_CACHE.  Thre
e610: 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 23 65  adData *pTsd;.#e
e620: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ndif..  /* Close
e630: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
e640: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
e650: 64 6c 65 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20  dle.  */.  pCur 
e660: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
e670: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
e680: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
e690: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
e6a0: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
e6b0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
e6c0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
e6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e6e0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
e6f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
e700: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
e710: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
e720: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
e730: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
e740: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
e750: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
e760: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
e770: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
e780: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
e790: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
e7a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
e7b0: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
e7c0: 69 74 65 46 72 65 65 28 70 29 3b 0a 0a 23 69 66  iteFree(p);..#if
e7d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e7e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
e7f0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e800: 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
e810: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
e820: 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
e830: 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
e840: 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
e850: 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
e860: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
e870: 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
e880: 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
e890: 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
e8a0: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
e8b0: 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
e8c0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
e8d0: 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
e8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
e8f0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
e900: 73 68 61 72 65 64 2d 62 74 72 65 65 20 66 72 6f  shared-btree fro
e910: 6d 20 74 68 65 20 74 68 72 65 61 64 20 77 69 64  m the thread wid
e920: 65 20 6c 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20  e list. Call .  
e930: 2a 2a 20 54 68 72 65 61 64 44 61 74 61 52 65 61  ** ThreadDataRea
e940: 64 4f 6e 6c 79 28 29 20 61 6e 64 20 74 68 65 6e  dOnly() and then
e950: 20 63 61 73 74 20 61 77 61 79 20 74 68 65 20 63   cast away the c
e960: 6f 6e 73 74 20 70 72 6f 70 65 72 74 79 20 6f 66  onst property of
e970: 20 74 68 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74   the .  ** point
e980: 65 72 20 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f  er to avoid allo
e990: 63 61 74 69 6e 67 20 74 68 72 65 61 64 20 64 61  cating thread da
e9a0: 74 61 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ta if it is not 
e9b0: 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
e9c0: 0a 20 20 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28  .  */.  pTsd = (
e9d0: 54 68 72 65 61 64 44 61 74 61 20 2a 29 73 71 6c  ThreadData *)sql
e9e0: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
e9f0: 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20  adOnly();.  if( 
ea00: 70 54 73 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42  pTsd->pBtree==pB
ea10: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
ea20: 20 70 54 73 64 3d 3d 73 71 6c 69 74 65 33 54 68   pTsd==sqlite3Th
ea30: 72 65 61 64 44 61 74 61 28 29 20 29 3b 0a 20 20  readData() );.  
ea40: 20 20 70 54 73 64 2d 3e 70 42 74 72 65 65 20 3d    pTsd->pBtree =
ea50: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   pBt->pNext;.  }
ea60: 65 6c 73 65 7b 0a 20 20 20 20 42 74 53 68 61 72  else{.    BtShar
ea70: 65 64 20 2a 70 50 72 65 76 3b 0a 20 20 20 20 66  ed *pPrev;.    f
ea80: 6f 72 28 70 50 72 65 76 3d 70 54 73 64 2d 3e 70  or(pPrev=pTsd->p
ea90: 42 74 72 65 65 3b 20 70 50 72 65 76 20 26 26 20  Btree; pPrev && 
eaa0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42  pPrev->pNext!=pB
eab0: 74 3b 20 70 50 72 65 76 3d 70 50 72 65 76 2d 3e  t; pPrev=pPrev->
eac0: 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28  pNext){}.    if(
ead0: 20 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20   pPrev ){.      
eae0: 61 73 73 65 72 74 28 20 70 54 73 64 3d 3d 73 71  assert( pTsd==sq
eaf0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
eb00: 29 20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  ) );.      pPrev
eb10: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
eb20: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
eb30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f  #endif..  /* Clo
eb40: 73 65 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  se the pager and
eb50: 20 66 72 65 65 20 74 68 65 20 73 68 61 72 65 64   free the shared
eb60: 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
eb70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
eb80: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
eb90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
eba0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
ebb0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65  .  if( pBt->xFre
ebc0: 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
ebd0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
ebe0: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
ebf0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
ec00: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
ec10: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
ec20: 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74 29   sqliteFree(pBt)
ec30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ec40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
ec50: 68 61 6e 67 65 20 74 68 65 20 62 75 73 79 20 68  hange the busy h
ec60: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
ec70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
ec80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
ec90: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 74 72 65  BusyHandler(Btre
eca0: 65 20 2a 70 2c 20 42 75 73 79 48 61 6e 64 6c 65  e *p, BusyHandle
ecb0: 72 20 2a 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20  r *pHandler){.  
ecc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ecd0: 70 2d 3e 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70  p->pBt;.  pBt->p
ece0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 48  BusyHandler = pH
ecf0: 61 6e 64 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65  andler;.  sqlite
ed00: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
ed10: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
ed20: 2c 20 70 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72  , pHandler);.  r
ed30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ed40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ed50: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
ed60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ed70: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
ed80: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
ed90: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
eda0: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
edb0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
edc0: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
edd0: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
ede0: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
edf0: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
ee00: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
ee10: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
ee20: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
ee30: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
ee40: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
ee50: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ee60: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
ee70: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
ee80: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
ee90: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
eea0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
eeb0: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
eec0: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
eed0: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
eee0: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
eef0: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
ef00: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
ef10: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
ef20: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
ef30: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
ef40: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
ef50: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
ef60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
ef70: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
ef80: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
ef90: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
efa0: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
efb0: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
efc0: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
efd0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
efe0: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
eff0: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
f000: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
f010: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
f020: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
f030: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f040: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
f050: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
f060: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
f070: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 72  er, mxPage);.  r
f080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
f0a0: 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
f0b0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
f0c0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
f0d0: 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
f0e0: 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
f0f0: 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
f100: 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
f110: 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
f120: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
f130: 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
f140: 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
f150: 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
f160: 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
f170: 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
f180: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
f190: 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
f1a0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
f1b0: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
f1c0: 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
f1d0: 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
f1e0: 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
f1f0: 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
f200: 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
f210: 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
f220: 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
f230: 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
f240: 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
f250: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f260: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
f270: 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
f280: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
f290: 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
f2a0: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
f2b0: 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
f2c0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
f2d0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
f2e0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
f2f0: 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
f300: 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72  , fullSync);.  r
f310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f320: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f330: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
f340: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
f350: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
f360: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
f370: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
f380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
f390: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
f3a0: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
f3b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
f3c0: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
f3d0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
f3e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
f3f0: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
f400: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
f410: 65 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  er );.  return s
f420: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
f430: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
f440: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
f450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f460: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
f470: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f480: 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
f490: 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
f4a0: 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
f4b0: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
f4c0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
f4d0: 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  per page..**.** 
f4e0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
f4f0: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
f500: 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
f510: 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
f520: 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
f530: 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
f540: 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
f550: 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
f560: 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
f570: 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
f580: 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
f590: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
f5a0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
f5b0: 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
f5c0: 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
f5d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
f5e0: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
f5f0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
f600: 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
f610: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
f620: 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
f630: 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
f640: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
f650: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
f660: 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
f670: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
f680: 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
f690: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
f6a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f6b0: 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
f6c0: 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
f6d0: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  t unchanged..*/.
f6e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f6f0: 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
f700: 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
f710: 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
f720: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f730: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
f740: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
f750: 46 69 78 65 64 20 29 7b 0a 20 20 20 20 72 65 74  Fixed ){.    ret
f760: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
f770: 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
f780: 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
f790: 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
f7a0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
f7b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
f7c0: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
f7d0: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
f7e0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
f7f0: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
f800: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
f810: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
f820: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
f830: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
f840: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
f850: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
f860: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
f870: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f880: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
f890: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
f8a0: 50 61 67 65 72 2c 20 70 61 67 65 53 69 7a 65 29  Pager, pageSize)
f8b0: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
f8c0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
f8d0: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
f8e0: 76 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ve;.  return SQL
f8f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f900: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
f910: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
f920: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
f930: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
f940: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
f950: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
f960: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
f970: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
f980: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
f990: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
f9a0: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
f9b0: 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
f9c0: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
f9d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f9e0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
f9f0: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
fa00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
fa10: 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
fa20: 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
fa30: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
fa40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
fa50: 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
fa60: 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
fa70: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
fa80: 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
fa90: 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
faa0: 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
fab0: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
fac0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
fad0: 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
fae0: 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
faf0: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
fb00: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
fb10: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
fb20: 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
fb30: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
fb40: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
fb50: 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
fb60: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
fb70: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
fb80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fb90: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
fba0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
fbb0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
fbc0: 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75   av = (autoVacuu
fbd0: 6d 3f 31 3a 30 29 3b 0a 20 20 69 6e 74 20 69 76  m?1:0);.  int iv
fbe0: 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3d 3d   = (autoVacuum==
fbf0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
fc00: 5f 49 4e 43 52 3f 31 3a 30 29 3b 0a 20 20 69 66  _INCR?1:0);.  if
fc10: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
fc20: 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74 2d  ixed && av!=pBt-
fc30: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
fc40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc50: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
fc60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fc70: 20 3d 20 61 76 3b 0a 20 20 70 42 74 2d 3e 69 6e   = av;.  pBt->in
fc80: 63 72 56 61 63 75 75 6d 20 3d 20 69 76 3b 0a 20  crVacuum = iv;. 
fc90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fca0: 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  K;.#endif.}../*.
fcb0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
fcc0: 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
fcd0: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
fce0: 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
fcf0: 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
fd00: 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
fd10: 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
fd20: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
fd30: 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
fd40: 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
fd50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fd60: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
fd70: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
fd80: 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 72  _NONE;.#else.  r
fd90: 65 74 75 72 6e 20 28 0a 20 20 20 20 28 21 70 2d  eturn (.    (!p-
fda0: 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
fdb0: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
fdc0: 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
fdd0: 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
fde0: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
fdf0: 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
fe00: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
fe10: 4e 43 52 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  NCR.  );.#endif.
fe20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
fe30: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
fe40: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
fe50: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
fe60: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
fe70: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
fe80: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
fe90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
fea0: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
feb0: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
fec0: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
fed0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
fee0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
fef0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
ff00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
ff10: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
ff20: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
ff30: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
ff40: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
ff50: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
ff60: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
ff70: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
ff80: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
ff90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ffa0: 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53 69    int rc, pageSi
ffb0: 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ze;.  MemPage *p
ffc0: 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42 74  Page1;.  if( pBt
ffd0: 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75 72  ->pPage1 ) retur
ffe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  n SQLITE_OK;.  r
fff0: 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
10000 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
10010 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10020 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10030 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f  ;.  ..  /* Do so
10040 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
10050 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
10060 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
10070 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
10080 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
10090 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
100a0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
100b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
100c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
100d0 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
100e0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
100f0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
10100 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
10110 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
10120 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
10130 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10140 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10150 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
10160 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
10170 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
10180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
10190 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
101a0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
101b0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
101c0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
101d0 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
101e0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
101f0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
10200 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
10210 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 20  ize<512 ){.     
10220 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10230 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10240 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
10250 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
10260 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
10270 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
10280 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
10290 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
102a0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
102b0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
102c0 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
102d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
102e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
102f0 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
10300 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a  ac = page1[21];.
10310 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
10320 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 32  dFrac = page1[22
10330 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c  ];.    pBt->minL
10340 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31 5b  eafFrac = page1[
10350 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  23];.#ifndef SQL
10360 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10370 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
10380 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
10390 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
103a0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  4*4])?1:0);.#end
103b0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
103c0 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
103d0 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
103e0 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
103f0 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
10400 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
10410 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
10420 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
10430 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
10440 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
10450 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
10460 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
10470 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
10480 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
10490 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
104a0 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
104b0 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
104c0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
104d0 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
104e0 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
104f0 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
10500 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
10510 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
10520 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
10530 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
10540 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
10550 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
10560 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
10570 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
10580 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
10590 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
105a0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
105b0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
105c0 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
105d0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
105e0 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
105f0 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
10600 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
10610 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
10620 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
10630 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32 35  >maxEmbedFrac/25
10640 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
10650 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
10660 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70  usableSize-12)*p
10670 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
10680 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
10690 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
106a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
106b0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
106c0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
106d0 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
106e0 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20 32  LeafFrac/255 - 2
106f0 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
10700 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
10710 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
10720 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
10730 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
10740 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
10750 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
10760 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
10770 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
10780 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
10790 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
107a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
107b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
107c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
107d0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
107e0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
107f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10800 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
10810 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
10820 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
10830 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
10840 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
10850 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
10860 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
10870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
10880 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
10890 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
108a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
108b0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 52 65 66  E_OK;.  if( pRef
108c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
108d0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
108e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
108f0 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
10900 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
10910 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
10920 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
10930 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
10940 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
10950 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
10960 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
10970 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
10980 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
10990 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
109a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
109b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
109c0 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
109d0 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
109e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
109f0 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
10a00 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
10a10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
10a20 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
10a30 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
10a40 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
10a50 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
10a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
10a70 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
10a80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10a90 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
10aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
10ab0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
10ac0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10ad0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
10ae0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
10af0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
10b00 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
10b10 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
10b20 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
10b30 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
10b40 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
10b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10b60 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
10b70 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
10b80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10b90 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
10ba0 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
10bb0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
10bc0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
10bd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
10be0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
10bf0 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
10c00 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
10c10 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
10c20 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
10c30 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10c40 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=1 ){.      if(
10c50 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
10c60 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
10c70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10c80 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
10c90 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61          pPage->a
10ca0 44 61 74 61 20 3d 20 26 28 28 75 38 2a 29 70 50  Data = &((u8*)pP
10cb0 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53  age)[-pBt->pageS
10cc0 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50  ize];.        pP
10cd0 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10ce0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
10cf0 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  gno = 1;.      }
10d00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
10d10 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
10d20 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
10d30 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
10d40 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
10d50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
10d60 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62  eate a new datab
10d70 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
10d80 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
10d90 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ge of the.** fil
10da0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10db0 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
10dc0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10dd0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
10de0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
10df0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ta;.  int rc;.  
10e00 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
10e10 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
10e20 50 61 67 65 72 29 3e 30 20 29 20 72 65 74 75 72  Pager)>0 ) retur
10e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
10e40 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
10e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
10e60 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
10e70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
10e80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
10e90 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
10ea0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
10eb0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
10ec0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
10ed0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
10ee0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
10ef0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
10f00 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
10f10 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
10f20 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61  ata[16], pBt->pa
10f30 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
10f40 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
10f50 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  19] = 1;.  data[
10f60 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  20] = pBt->pageS
10f70 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
10f80 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31  eSize;.  data[21
10f90 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65  ] = pBt->maxEmbe
10fa0 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 32  dFrac;.  data[22
10fb0 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65  ] = pBt->minEmbe
10fc0 64 46 72 61 63 3b 0a 20 20 64 61 74 61 5b 32 33  dFrac;.  data[23
10fd0 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ] = pBt->minLeaf
10fe0 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Frac;.  memset(&
10ff0 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
11000 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
11010 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
11020 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
11030 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
11040 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
11050 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
11060 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11070 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
11080 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
11090 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
110a0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
110b0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
110c0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
110d0 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
110e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
110f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
11100 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
11110 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
11120 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11130 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
11140 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
11150 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
11160 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
11170 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
11180 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
11190 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
111a0 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
111b0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
111c0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
111d0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
111e0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
111f0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
11200 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
11210 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
11220 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
11230 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
11240 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
11250 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
11260 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
11270 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
11280 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
11290 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
112a0 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
112b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
112c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
112d0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
112e0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
112f0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
11300 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
11310 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
11320 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
11330 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
11340 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
11350 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
11360 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
11370 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
11380 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
11390 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
113a0 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
113b0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
113c0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
113d0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
113e0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
113f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11400 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
11410 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
11420 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
11430 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
11440 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
11450 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
11460 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
11470 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
11480 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
11490 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
114a0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
114b0 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
114c0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
114d0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
114e0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
114f0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
11500 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
11510 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
11520 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
11530 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
11540 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
11550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11560 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
11570 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
11580 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
11590 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
115a0 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
115b0 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
115c0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
115d0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
115e0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
115f0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
11600 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
11610 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
11620 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
11630 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
11640 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
11650 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
11660 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
11670 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
11680 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
11690 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
116a0 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
116b0 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
116c0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
116d0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
116e0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
116f0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
11700 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
11710 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
11720 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
11730 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
11740 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
11750 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
11760 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
11770 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
11780 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
11790 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
117a0 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
117b0 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
117c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
117d0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
117e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
117f0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
11800 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
11810 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
11820 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
11830 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
11840 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
11850 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
11860 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
11870 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
11880 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
11890 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
118a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
118b0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
118c0 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
118d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
118e0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
118f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11900 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  _OK;.  }..  /* W
11910 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11920 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
11930 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
11940 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
11950 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
11960 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
11970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11980 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  _READONLY;.  }..
11990 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
119a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
119b0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
119c0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
119d0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
119e0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
119f0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
11a00 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
11a10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
11a20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
11a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
11a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
11a50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
11a60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
11a70 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrflag ){.    re
11a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
11a90 3b 0a 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20  ;.  }..  do {.  
11aa0 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
11ab0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  1==0 ){.      rc
11ac0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
11ad0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
11ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11af0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
11b00 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
11b10 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
11b30 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
11b40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
11b50 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
11b60 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  n(pBt->pPage1->p
11b70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e 31  DbPage, wrflag>1
11b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11ba0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
11bb0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
11bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11bd0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
11be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11bf0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  K ){.      if( w
11c00 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53  rflag ) pBt->inS
11c10 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
11c20 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b  se{.      unlock
11c30 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
11c40 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
11c50 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
11c60 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
11c70 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11c80 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
11c90 20 20 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65     sqlite3Invoke
11ca0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d  BusyHandler(pBt-
11cb0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
11cc0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
11cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11ce0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11cf0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
11d00 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
11d10 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
11d20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
11d30 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
11d40 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
11d50 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
11d60 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
11d70 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
11d80 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11d90 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
11da0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65     }.  }..  btre
11db0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
11dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
11dd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11de0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
11df0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
11e00 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
11e10 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
11e20 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
11e30 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
11e40 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
11e50 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
11e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
11e70 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
11e80 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
11e90 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
11ea0 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
11eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
11ec0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
11ed0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
11ee0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
11f10 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
11f20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
11f50 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
11f60 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11f70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
11f80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11f90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
11fa0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
11fb0 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
11fc0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
11fd0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
11fe0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
11ff0 67 6e 6f 3b 0a 0a 20 20 69 6e 69 74 50 61 67 65  gno;..  initPage
12000 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 6e 43  (pPage, 0);.  nC
12010 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
12020 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
12030 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
12040 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
12050 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
12060 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
12070 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
12080 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
12090 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
120a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
120b0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
120c0 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
120d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
120e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
120f0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
12100 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
12110 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
12120 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
12130 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
12140 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
12150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12160 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
12170 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
12180 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
12190 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
121a0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
121b0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
121c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
121d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
121e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
121f0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
12200 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
12210 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
12220 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
12230 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
12240 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
12250 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
12260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
12270 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
12280 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
12290 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
122a0 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
122b0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
122c0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
122d0 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
122e0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
122f0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
12300 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
12310 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
12320 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
12330 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
12340 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
12350 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12360 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
12370 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
12380 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
12390 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
123a0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
123c0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
123d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
123e0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
123f0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
12400 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
12410 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
12440 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
12450 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
12460 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
12470 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
12480 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
12490 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
124a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
124b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
124c0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
124d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
124e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
124f0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
12500 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
12510 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
12520 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
12530 29 7b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ){.  if( eType==
12540 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
12550 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
12560 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
12570 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
12580 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
12590 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
125a0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
125b0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
125c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
125d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
125e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
125f0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
12600 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
12610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12620 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
12630 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
12640 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
12650 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 69  nt nCell;..    i
12660 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
12670 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
12680 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
12690 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
126a0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
126b0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
126c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
126d0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
126e0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
126f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
12700 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
12710 20 20 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72      parseCellPtr
12720 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
12730 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
12740 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
12750 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
12760 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
12770 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
12780 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20  Overflow]) ){.  
12790 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
127a0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
127b0 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
127c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
127d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
127e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
127f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
12800 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
12810 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
12820 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12830 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
12840 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12860 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
12870 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
12880 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
12890 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
128a0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
128b0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
128c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
128d0 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
128e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
128f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12900 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
12910 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
12920 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
12930 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
12940 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
12950 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
12960 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
12970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12980 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
12990 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
129a0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
129b0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
129c0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
129d0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
129e0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
129f0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
12a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
12a10 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
12a20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
12a30 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
12a40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
12a50 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
12a60 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
12a70 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
12a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12a90 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
12aa0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
12ab0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
12ac0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
12ad0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12ae0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
12af0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
12b00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
12b10 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  ePage           
12b20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
12b30 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
12b40 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  to */.){.  MemPa
12b50 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
12b60 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
12b70 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
12b80 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
12b90 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
12ba0 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
12bb0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
12bc0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
12bd0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
12be0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
12bf0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
12c00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
12c10 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
12c20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
12c30 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
12c40 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
12c50 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
12c60 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
12c70 20 69 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f   it's current lo
12c80 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
12c90 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
12ca0 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
12cb0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
12cc0 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
12cd0 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
12ce0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
12cf0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
12d00 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
12d10 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
12d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
12d30 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
12d40 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
12d50 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69   iFreePage);.  i
12d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12d80 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
12d90 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
12da0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
12db0 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
12dc0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
12dd0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
12de0 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
12df0 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
12e00 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
12e10 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
12e20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
12e30 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
12e40 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
12e50 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
12e60 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
12e70 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
12e80 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
12e90 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
12ea0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
12eb0 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
12ec0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
12ed0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
12ee0 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
12ef0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
12f00 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
12f10 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
12f20 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
12f30 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
12f40 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
12f50 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
12f60 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
12f70 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
12f80 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
12f90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
12fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12fb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12fc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12fd0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
12fe0 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
12ff0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
13000 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
13010 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
13020 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
13030 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
13040 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
13050 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
13060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13070 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13080 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13090 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
130a0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
130b0 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
130c0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
130d0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
130e0 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
130f0 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
13100 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
13110 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
13120 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
13130 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
13140 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
13150 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
13160 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20   = getPage(pBt, 
13170 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
13180 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
13190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
131a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
131b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
131c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
131d0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
131e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
131f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13200 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13210 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
13220 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13230 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
13240 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13250 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
13260 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
13270 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
13280 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
13290 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
132a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
132b0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
132c0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
132d0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b  Type, iPtrPage);
132e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
132f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
13300 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
13310 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
13320 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
13330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
13340 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
13350 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
13360 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
13370 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
13380 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
13390 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
133a0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
133b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
133c0 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
133d0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
133e0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
133f0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
13400 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
13410 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
13420 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
13430 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
13440 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
13450 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
13460 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
13470 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
13480 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
13490 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
134a0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
134b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
134c0 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
134d0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
134e0 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
134f0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
13500 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
13510 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
13520 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
13530 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
13540 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
13550 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
13560 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
13570 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
13580 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
13590 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
135a0 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
135b0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
135c0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
135d0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
135e0 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74   complete..*/.st
135f0 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
13600 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
13610 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
13620 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50  ){.  Pgno iLastP
13630 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
13640 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74  * Last page in t
13650 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
13660 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
13670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13680 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
13690 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
136a0 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 4c 61 73 74  list */..  iLast
136b0 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  Pg = pBt->nTrunc
136c0 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d  ;.  if( iLastPg=
136d0 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
136e0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
136f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
13700 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
13710 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
13720 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
13730 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
13740 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13750 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
13760 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
13770 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
13780 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
13790 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
137a0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
137b0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
137c0 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e  FreeList==0 || n
137d0 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a  Fin==iLastPg ){.
137e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
137f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
13800 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
13810 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
13820 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
13830 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13850 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13860 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
13870 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
13880 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
13890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
138a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
138b0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
138c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
138d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69  ){.      if( nFi
138e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
138f0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
13900 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
13910 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
13920 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
13930 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
13940 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nFin is non-zero
13950 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
13960 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
13970 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
13980 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
13990 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
139a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
139b0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
139c0 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
139d0 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
139e0 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
139f0 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
13a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
13a10 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
13a20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
13a30 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
13a40 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
13a50 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
13a60 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
13a70 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20  LastPg, 1);.    
13a80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13aa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13ac0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
13ad0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
13ae0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13af0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
13b00 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
13b10 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
13b20 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
13b30 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
13b40 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
13b50 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
13b60 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
13b70 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 67  g;..      rc = g
13b80 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
13b90 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
13ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13bc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13bd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13be0 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
13bf0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
13c00 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
13c10 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
13c20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
13c30 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
13c40 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
13c50 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
13c60 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
13c70 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
13c80 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
13c90 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
13ca0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
13cb0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
13cc0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
13cd0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
13ce0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
13cf0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
13d00 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
13d10 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
13d20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
13d30 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
13d40 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
13d50 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
13d60 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
13d70 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
13d80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
13d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13da0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
13db0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
13dc0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
13dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13de0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
13df0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
13e00 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
13e10 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
13e20 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
13e30 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
13e40 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
13e50 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
13e60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
13e70 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
13e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13eb0 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20  .      } .      
13ec0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
13ed0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
13ee0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
13ef0 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20   iFreePg);.     
13f00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
13f10 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
13f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f30 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
13f40 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20   rc;.      } .  
13f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e    }.  }..  pBt->
13f60 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67  nTrunc = iLastPg
13f70 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70   - 1;.  while( p
13f80 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44  Bt->nTrunc==PEND
13f90 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
13fa0 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
13fb0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75  E(pBt, pBt->nTru
13fc0 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  nc) ){.    pBt->
13fd0 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20  nTrunc--;.  }.  
13fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
14000 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
14010 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
14020 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
14030 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
14040 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
14050 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
14060 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
14070 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
14080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
14090 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
140a0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
140b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
140c0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
140d0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
140e0 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
140f0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
14100 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  no error occured
14110 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
14120 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
14130 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
14140 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
14150 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14160 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
14170 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
14180 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14190 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
141a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
141b0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
141c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
141d0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
141e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
141f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14200 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
14210 20 20 72 65 74 75 72 6e 20 69 6e 63 72 56 61 63    return incrVac
14220 75 75 6d 53 74 65 70 28 70 2d 3e 70 42 74 2c 20  uumStep(p->pBt, 
14230 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
14240 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14250 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
14260 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
14270 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
14280 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
14290 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
142a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
142b0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
142c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
142d0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
142e0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
142f0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
14300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14310 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
14320 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
14330 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
14340 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
14350 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
14360 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
14370 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
14380 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
14390 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
143a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
143b0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
143c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
143d0 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a  Pgno *pnTrunc){.
143e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
143f0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
14400 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
14410 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ger;.#ifndef NDE
14420 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d  BUG.  int nRef =
14430 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
14440 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  count(pPager);.#
14450 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14460 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
14470 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
14480 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
14490 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
144a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
144b0 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
144c0 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
144d0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
144e0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
144f0 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
14500 53 69 7a 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Size;.      Pgno
14510 20 6e 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33   nOrig = sqlite3
14520 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
14530 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
14540 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
14550 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
14560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
14570 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14580 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
14590 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
145a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
145b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
145c0 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
145d0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
145e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
145f0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
14600 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
14610 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
14620 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
14630 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
14640 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
14650 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
14660 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
14670 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
14680 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
14690 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
146a0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
146b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
146c0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
146d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
146e0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
146f0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
14700 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
14710 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
14720 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
14730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14740 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
14750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14760 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
14770 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
14780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
14790 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
147a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
147b0 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
147c0 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
147d0 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
147e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
147f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
14800 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
14810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
14820 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
14830 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
14840 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14850 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
14860 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
14870 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
14880 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
14890 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
148a0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
148b0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
148c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
148d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
148e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
148f0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14920 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e  K ){.    *pnTrun
14930 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b  c = pBt->nTrunc;
14940 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  .    pBt->nTrunc
14950 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
14960 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65  rt( nRef==sqlite
14970 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
14980 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
14990 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
149a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
149b0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
149c0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
149d0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
149e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
149f0 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
14a00 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
14a10 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
14a20 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
14a30 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
14a40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
14a50 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
14a60 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
14a70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
14a80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14a90 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
14aa0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
14ab0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
14ac0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
14ad0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
14ae0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14af0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
14b00 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
14b10 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
14b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
14b30 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
14b40 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
14b50 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
14b60 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
14b70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14b80 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
14b90 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
14ba0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
14bb0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
14bc0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
14bd0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
14be0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
14bf0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
14c00 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
14c10 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
14c20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
14c30 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
14c40 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20  reeCommit() for 
14c50 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
14c60 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
14c70 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
14c80 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
14c90 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
14ca0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
14cb0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
14cc0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
14cd0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
14ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14cf0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
14d00 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
14d10 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
14d20 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
14d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
14d40 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
14d50 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
14d60 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
14d70 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
14d80 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
14d90 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
14da0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
14db0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
14dc0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
14dd0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
14de0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
14df0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
14e00 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
14e10 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
14e20 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
14e30 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
14e40 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
14e50 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
14e60 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
14e70 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
14e80 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
14e90 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
14ea0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
14eb0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
14ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14ed0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
14ee0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
14ef0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14f00 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
14f10 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
14f20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
14f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14f40 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
14f50 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
14f60 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
14f70 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14f80 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20    Pgno nTrunc = 
14f90 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
14fa0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14fb0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
14fc0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
14fd0 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
14fe0 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e  umCommit(pBt, &n
14ff0 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69  Trunc); .      i
15000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
15020 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15030 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15050 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
15060 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
15070 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ster, nTrunc);. 
15080 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15090 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
150a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
150b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
150c0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
150d0 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
150e0 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
150f0 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
15100 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
15110 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ** sqlite3BtreeS
15120 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  ync() routine do
15130 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
15140 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  se and should be
15150 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f   invoked.** prio
15160 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
15170 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
15180 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
15190 28 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a  () routine did.*
151a0 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  * all the work o
151b0 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
151c0 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
151d0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
151e0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
151f0 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
15200 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
15210 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
15220 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
15230 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
15240 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
15250 61 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ate the rollback
15260 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69   journal.** (whi
15270 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
15280 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
15290 6d 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f  mit) and drop lo
152a0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
152b0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
152c0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
152d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
152e0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
152f0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
15300 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
15310 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
15320 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
15330 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
15340 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
15350 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15360 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
15370 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
15380 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15390 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
153a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
153b0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
153c0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
153d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
153e0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
153f0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
15400 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
15410 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
15420 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
15430 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
15440 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
15450 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15460 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
15470 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
15480 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
15490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
154a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
154b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
154c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
154d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
154e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
154f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15500 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
15510 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  D;.    pBt->inSt
15520 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e  mt = 0;.  }.  un
15530 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
15540 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
15550 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69  andle has any ki
15560 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
15570 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
15580 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
15590 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20  n.  ** count of 
155a0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
155b0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
155c0 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68  tion count reach
155d0 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74  es 0, set.  ** t
155e0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
155f0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
15600 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
15610 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65  Unused() call be
15620 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e  low.  ** will un
15630 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
15640 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
15650 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
15660 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  E ){.    pBt->nT
15670 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
15680 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
15690 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
156a0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
156b0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
156c0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
156d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e    /* Set the han
156e0 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61  dles current tra
156f0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
15700 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
15710 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
15720 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
15730 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
15740 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
15750 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
15760 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   */.  p->inTrans
15770 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
15780 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
15790 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
157a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
157b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
157c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
157d0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
157e0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
157f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15800 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
15810 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
15820 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15830 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
15840 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
15870 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b  mmitPhaseTwo(p);
15880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15890 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
158a0 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
158b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
158c0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
158d0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
158e0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
158f0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
15900 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
15910 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
15920 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
15930 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
15940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15950 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
15960 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
15970 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
15980 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
15990 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
159a0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
159b0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
159c0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
159d0 3e 77 72 46 6c 61 67 20 29 20 72 2b 2b 3b 20 0a  >wrFlag ) r++; .
159e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
159f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
15a00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
15a10 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
15a20 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
15a30 2a 20 50 72 69 6e 74 20 64 65 62 75 67 67 69 6e  * Print debuggin
15a40 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  g information ab
15a50 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  out all cursors 
15a60 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
15a70 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ut..*/.void sqli
15a80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 4c 69  te3BtreeCursorLi
15a90 73 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  st(Btree *p){.  
15aa0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
15ab0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15ac0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 66 6f 72 28  = p->pBt;.  for(
15ad0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
15ae0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
15af0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
15b00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
15b10 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
15b20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20    char *zMode = 
15b30 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3f 20 22  pCur->wrFlag ? "
15b40 72 77 22 20 3a 20 22 72 6f 22 3b 0a 20 20 20 20  rw" : "ro";.    
15b50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
15b60 74 66 28 22 43 55 52 53 4f 52 20 25 70 20 72 6f  tf("CURSOR %p ro
15b70 6f 74 65 64 20 61 74 20 25 34 64 28 25 73 29 20  oted at %4d(%s) 
15b80 63 75 72 72 65 6e 74 6c 79 20 61 74 20 25 64 2e  currently at %d.
15b90 25 64 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %d%s\n",.       
15ba0 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  pCur, pCur->pgno
15bb0 52 6f 6f 74 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20  Root, zMode,.   
15bc0 20 20 20 20 70 50 61 67 65 20 3f 20 70 50 61 67      pPage ? pPag
15bd0 65 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 70 43 75  e->pgno : 0, pCu
15be0 72 2d 3e 69 64 78 2c 0a 20 20 20 20 20 20 20 28  r->idx,.       (
15bf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
15c00 52 53 4f 52 5f 56 41 4c 49 44 29 20 3f 20 22 22  RSOR_VALID) ? ""
15c10 20 3a 20 22 20 65 6f 66 22 0a 20 20 20 20 29 3b   : " eof".    );
15c20 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
15c30 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
15c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
15c50 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
15c60 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
15c70 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
15c80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
15c90 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
15ca0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
15cb0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
15cc0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15cd0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
15ce0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
15cf0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
15d00 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
15d10 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
15d20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15d30 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
15d40 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
15d50 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
15d60 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
15d70 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
15d80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d90 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
15da0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
15db0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15dc0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
15dd0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 72  ge *pPage1;..  r
15de0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
15df0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
15e00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15e10 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
15e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
15e40 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
15e50 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
15e60 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
15e70 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
15e80 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
15e90 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
15ea0 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
15eb0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
15ec0 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
15ed0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
15ee0 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
15ef0 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
15f00 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
15f10 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
15f20 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
15f30 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
15f40 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
15f50 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
15f60 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
15f70 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
15f80 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
15f90 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
15fa0 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
15fb0 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
15fc0 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
15fd0 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
15fe0 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
15ff0 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
16000 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
16010 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  pCursor ){.     
16020 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16030 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74  Bt->pCursor->pBt
16040 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20  ree->pSqlite;.  
16050 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20      if( db ){.  
16060 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 62 6f        sqlite3Abo
16070 72 74 4f 74 68 65 72 41 63 74 69 76 65 56 64 62  rtOtherActiveVdb
16080 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
16090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
160a0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
160b0 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
160c0 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
160d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
160e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
160f0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23  .    int rc2;..#
16100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16110 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16120 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
16130 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61  0;.#endif..    a
16140 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
16150 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
16160 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
16170 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
16180 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
16190 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
161a0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
161b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
161c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
161d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
161e0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
161f0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
16200 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
16210 2a 2a 20 63 61 6c 6c 20 67 65 74 50 61 67 65 28  ** call getPage(
16220 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
16230 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70  n to make sure p
16240 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 0a  Page1->aData is.
16250 20 20 20 20 2a 2a 20 73 65 74 20 63 6f 72 72 65      ** set corre
16260 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
16270 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c   getPage(pBt, 1,
16280 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
16290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
162a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
162b0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
162c0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
162d0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
162e0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
162f0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
16300 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
16310 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
16320 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
16330 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
16340 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
16350 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
16360 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
16370 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
16380 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
16390 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
163a0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
163b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
163c0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
163d0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69  S_NONE;.  pBt->i
163e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c  nStmt = 0;.  unl
163f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
16400 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
16410 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72  ntegrity(p);.  r
16420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16430 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
16440 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
16450 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
16460 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
16470 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
16480 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
16490 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
164a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
164b0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
164c0 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
164d0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
164e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
164f0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
16500 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
16510 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
16520 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
16530 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
16540 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
16550 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
16560 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
16570 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
16580 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
16590 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
165a0 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
165b0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
165c0 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
165d0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
165e0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
165f0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
16600 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
16610 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
16620 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
16630 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
16640 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
16650 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
16660 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
16670 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
16680 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
16690 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
166a0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
166b0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
166c0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
166d0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
166e0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
166f0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
16700 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
16710 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
16720 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
16730 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
16740 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16750 74 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54  t;.  if( (p->inT
16760 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
16770 45 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d  E) || pBt->inStm
16780 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16790 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
167a0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
167b0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
167c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
167d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
167e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
167f0 0a 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61  .  rc = pBt->rea
16800 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
16810 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72  K : sqlite3Pager
16820 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70  StmtBegin(pBt->p
16830 50 61 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 69  Pager);.  pBt->i
16840 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 72 65 74  nStmt = 1;.  ret
16850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16860 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61  * Commit the sta
16870 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  tment subtransac
16880 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
16890 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20  n progress.  If 
168a0 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63  no.** subtransac
168b0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
168c0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
168d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
168e0 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42  treeCommitStmt(B
168f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16900 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
16910 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16920 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  if( pBt->inStmt 
16930 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
16940 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  y ){.    rc = sq
16950 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
16960 6d 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  mmit(pBt->pPager
16970 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16990 20 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d    }.  pBt->inStm
169a0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
169b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
169c0 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65  lback the active
169d0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
169e0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e  ansaction.  If n
169f0 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  o subtransaction
16a00 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68  .** is active th
16a10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16a20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  no-op..**.** All
16a30 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
16a40 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
16a50 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
16a60 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20   Any attempt.** 
16a70 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20  to use a cursor 
16a80 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
16a90 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16aa0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
16ab0 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  .** will result 
16ac0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
16ad0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ae0 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72  RollbackStmt(Btr
16af0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16b20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
16b30 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28  3MallocDisallow(
16b40 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
16b50 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
16b60 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
16b70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
16b80 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  tmtRollback(pBt-
16b90 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  >pPager);.    as
16ba0 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
16bb0 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
16bc0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  );.    pBt->inSt
16bd0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  mt = 0;.  }.  sq
16be0 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77  lite3MallocAllow
16bf0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
16c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  .}../*.** Defaul
16c10 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73 6f 6e  t key comparison
16c20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
16c30 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d 70 61  used if no compa
16c40 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 0a 2a  rison function.*
16c50 2a 20 69 73 20 73 70 65 63 69 66 69 65 64 20 6f  * is specified o
16c60 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  n the sqlite3Btr
16c70 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c 6c 2e  eeCursor() call.
16c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
16c90 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f  fltCompare(.  vo
16ca0 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  id *NotUsed,    
16cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
16cc0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75 73 65   data is not use
16cd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 63  d */.  int n1, c
16ce0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 20  onst void *p1,  
16cf0 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74    /* First key t
16d00 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 69  o compare */.  i
16d10 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nt n2, const voi
16d20 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53 65 63  d *p2     /* Sec
16d30 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61  ond key to compa
16d40 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  re */.){.  int c
16d50 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  ;.  c = memcmp(p
16d60 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f 20 6e  1, p2, n1<n2 ? n
16d70 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28 20 63  1 : n2);.  if( c
16d80 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e  ==0 ){.    c = n
16d90 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65  1 - n2;.  }.  re
16da0 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
16db0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
16dc0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
16dd0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
16de0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
16df0 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74  iTable.  The act
16e00 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20   of acquiring a 
16e10 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65  cursor gets a re
16e20 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  ad lock on .** t
16e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16e40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
16e50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
16e60 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
16e70 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
16e80 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
16e90 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
16ea0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
16eb0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
16ec0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
16ed0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
16ee0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
16ef0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
16f00 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
16f10 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
16f20 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
16f30 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
16f40 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
16f50 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
16f60 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
16f70 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
16f80 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
16f90 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
16fa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
16fb0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
16fc0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
16fd0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
16fe0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
16ff0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
17000 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
17010 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
17020 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
17030 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
17040 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
17050 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
17060 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
17070 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
17080 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
17090 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
170a0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
170b0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
170c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
170d0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
170e0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
170f0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
17100 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
17110 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
17120 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
17130 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
17140 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
17150 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
17160 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
17170 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
17180 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
17190 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
171a0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
171b0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
171c0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
171d0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
171e0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  tly..**.** The c
171f0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
17200 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67 69 63  on must be logic
17210 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 6f  ally the same fo
17220 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 0a 2a  r every cursor.*
17230 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  * on a particula
17240 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e 67 69  r table.  Changi
17250 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
17260 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  n function will 
17270 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69 6e 63  result.** in inc
17280 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
17290 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 70 61  s.  If the compa
172a0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  rison function i
172b0 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64 65 66  s NULL, a.** def
172c0 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  ault comparison 
172d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
172e0 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  .  The compariso
172f0 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  n function is.**
17300 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20   always ignored 
17310 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  for INTKEY table
17320 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
17330 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
17340 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17370 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
17380 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
173b0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
173c0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
173d0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
17400 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
17410 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  nly */.  int (*x
17420 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  Cmp)(void*,int,c
17430 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
17440 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20  onst void*), /* 
17450 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66  Key Comparison f
17460 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  unc */.  void *p
17470 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
174a0 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
174b0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 2a  */.  BtCursor **
174c0 70 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  ppCur           
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
174f0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
17500 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
17510 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42 74  rsor *pCur;.  Bt
17520 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17530 3e 70 42 74 3b 0a 0a 20 20 2a 70 70 43 75 72 20  >pBt;..  *ppCur 
17540 3d 20 30 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  = 0;.  if( wrFla
17550 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  g ){.    if( pBt
17560 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
17570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17580 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
17590 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
175a0 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62  eadLocks(p, iTab
175b0 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  le, 0) ){.      
175c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
175d0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  CKED;.    }.  }.
175e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
175f0 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  e1==0 ){.    rc 
17600 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  = lockBtreeWithR
17610 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28  etry(p);.    if(
17620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17630 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17640 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
17650 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
17660 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  & wrFlag ){.    
17670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17680 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
17690 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
176a0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
176b0 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66  f(*pCur) );.  if
176c0 28 20 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20  ( pCur==0 ){.   
176d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
176e0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  EM;.    goto cre
176f0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
17700 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72  tion;.  }.  pCur
17710 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
17720 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28  no)iTable;.  if(
17730 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71   iTable==1 && sq
17740 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
17750 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
17760 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
17770 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
17780 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
17790 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
177a0 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
177b0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
177c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
177d0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b  pCur->pPage, 0);
177e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
177f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
17800 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
17810 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  xception;.  }.. 
17820 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
17830 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
17840 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
17850 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
17860 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
17870 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20  ables, link the 
17880 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
17890 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e  BtShared list an
178a0 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68  d set *ppCur (th
178b0 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72  e.  ** output ar
178c0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
178d0 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20  unction)..  */. 
178e0 20 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20   pCur->xCompare 
178f0 3d 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20  = xCmp ? xCmp : 
17900 64 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70  dfltCompare;.  p
17910 43 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67  Cur->pArg = pArg
17920 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
17930 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 77 72   = p;.  pCur->wr
17940 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20  Flag = wrFlag;. 
17950 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
17960 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
17970 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
17980 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
17990 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
179a0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
179b0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
179c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
179d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 2a  SOR_INVALID;.  *
179e0 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a 20  ppCur = pCur;.. 
179f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17a00 4b 3b 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  K;.create_cursor
17a10 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 69 66  _exception:.  if
17a20 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 72 65  ( pCur ){.    re
17a30 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
17a40 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  pPage);.    sqli
17a50 74 65 46 72 65 65 28 70 43 75 72 29 3b 0a 20 20  teFree(pCur);.  
17a60 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
17a70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
17a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
17a90 66 20 30 20 20 2f 2a 20 4e 6f 74 20 55 73 65 64  f 0  /* Not Used
17aa0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65   */./*.** Change
17ab0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17ac0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  e comparison fun
17ad0 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 20  ction used by a 
17ae0 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
17af0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
17b00 6f 6d 70 61 72 65 28 0a 20 20 42 74 43 75 72 73  ompare(.  BtCurs
17b10 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
17b20 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 77   The cursor to w
17b30 68 6f 73 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20  hose comparison 
17b40 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 68 61 6e  function is chan
17b50 67 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  ged */.  int(*xC
17b60 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  mp)(void*,int,co
17b70 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
17b80 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f 2a 20 4e  nst void*), /* N
17b90 65 77 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ew comparison fu
17ba0 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  nc */.  void *pA
17bb0 72 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  rg          /* F
17bc0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
17bd0 20 78 43 6d 70 28 29 20 2a 2f 0a 29 7b 0a 20 20   xCmp() */.){.  
17be0 70 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d  pCur->xCompare =
17bf0 20 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64   xCmp ? xCmp : d
17c00 66 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  fltCompare;.  pC
17c10 75 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b  ur->pArg = pArg;
17c20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17c30 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
17c40 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
17c50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17c60 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
17c70 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
17c80 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
17c90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17ca0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
17cb0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
17cc0 72 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  r){.  BtShared *
17cd0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
17ce0 65 65 2d 3e 70 42 74 3b 0a 20 20 63 6c 65 61 72  ee->pBt;.  clear
17cf0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
17d00 43 75 72 29 3b 0a 20 20 69 66 28 20 70 43 75 72  Cur);.  if( pCur
17d10 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
17d20 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
17d30 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
17d40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
17d50 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
17d60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  r->pNext;.  }.  
17d70 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
17d80 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
17d90 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
17da0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72  ->pPrev;.  }.  r
17db0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
17dc0 3e 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63  >pPage);.  unloc
17dd0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17de0 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Bt);.  sqliteFre
17df0 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
17e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17e10 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d  /*.** Make a tem
17e20 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79  porary cursor by
17e30 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
17e40 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43  fields of pTempC
17e50 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f  ur..** The tempo
17e60 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e  rary cursor is n
17e70 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ot on the cursor
17e80 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74   list for the Bt
17e90 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ree..*/.static v
17ea0 6f 69 64 20 67 65 74 54 65 6d 70 43 75 72 73 6f  oid getTempCurso
17eb0 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
17ec0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
17ed0 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63 70 79 28  pCur){.  memcpy(
17ee0 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
17ef0 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
17f00 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
17f10 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
17f20 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
17f30 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  if( pTempCur->pP
17f40 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
17f50 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70  e3PagerRef(pTemp
17f60 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50  Cur->pPage->pDbP
17f70 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
17f80 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70  ** Delete a temp
17f90 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63  orary cursor suc
17fa0 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79  h as was made by
17fb0 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f   the CreateTempo
17fc0 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20  raryCursor().** 
17fd0 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a  function above..
17fe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
17ff0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
18000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
18010 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  {.  if( pCur->pP
18020 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
18030 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
18040 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
18050 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
18060 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
18070 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 66 69 65  tCursor.info fie
18080 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ld of the given 
18090 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
180a0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74  .** If it is not
180b0 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
180c0 63 61 6c 6c 20 70 61 72 73 65 43 65 6c 6c 28 29  call parseCell()
180d0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
180e0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
180f0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
18100 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
18110 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
18120 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
18130 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
18140 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
18150 20 63 61 6c 6c 73 20 74 6f 20 70 61 72 73 65 43   calls to parseC
18160 65 6c 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ell()..*/.static
18170 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
18180 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
18190 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
181a0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
181b0 20 20 20 20 70 61 72 73 65 43 65 6c 6c 28 70 43      parseCell(pC
181c0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
181d0 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66  >idx, &pCur->inf
181e0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  o);.  }else{.#if
181f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
18200 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
18210 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
18220 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
18230 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65 6c 6c  );.    parseCell
18240 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
18250 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b  ur->idx, &info);
18260 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
18270 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
18280 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
18290 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  nfo))==0 );.#end
182a0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
182b0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
182c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
182d0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
182e0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
182f0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
18300 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
18310 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
18320 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
18330 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
18340 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
18350 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
18360 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
18370 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
18380 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
18390 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
183a0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
183b0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
183c0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
183d0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
183e0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
183f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
18400 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
18410 74 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72  t rc = restoreOr
18420 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
18430 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
18440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18450 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18460 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18470 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
18480 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18490 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
184a0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
184b0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
184c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
184d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
184e0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
184f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
18500 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
18510 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
18520 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
18540 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
18550 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
18560 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
18570 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
18580 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
18590 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
185a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
185b0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
185c0 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
185d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
185e0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
185f0 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
18600 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
18610 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
18620 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
18630 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
18640 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
18650 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
18660 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
18670 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
18680 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
18690 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74  .  int rc = rest
186a0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
186b0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
186c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
186d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
186e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
186f0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
18700 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
18710 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18720 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
18730 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
18740 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  VALID ){.      /
18750 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  * Not pointing a
18760 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  t a valid entry 
18770 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  - set *pSize to 
18780 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69  0. */.      *pSi
18790 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
187a0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
187b0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
187c0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
187d0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20  >info.nData;.   
187e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
187f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
18800 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
18810 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
18820 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
18830 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
18840 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
18850 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
18860 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
18870 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
18880 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
18890 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
188a0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
188b0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
188c0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
188d0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
188e0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
188f0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
18900 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
18910 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
18920 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
18930 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
18940 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
18950 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
18960 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50  .**.** Unless pP
18970 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c  gnoNext is NULL,
18980 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
18990 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
189a0 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69  rflow .** page i
189b0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
189c0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
189d0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
189e0 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74  age ovfl.** is t
189f0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
18a00 69 74 27 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74  it's linked list
18a10 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
18a20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
18a30 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
18a40 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61   not NULL, *ppPa
18a50 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
18a60 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65   MemPage* handle
18a70 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66  .** for page ovf
18a80 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  l. The underlyin
18a90 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79  g pager page may
18aa0 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
18ab0 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  sted.** with the
18ac0 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
18ad0 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65  set, so the page
18ae0 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65   data accessable
18af0 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e   via.** this han
18b00 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74  dle may not be t
18b10 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  rusted..*/.stati
18b20 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
18b30 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
18b40 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
18b50 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
18b60 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
18b70 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
18b80 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
18b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18ba0 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
18bb0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
18bc0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
18bd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
18be0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
18bf0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
18c00 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69  no next = 0;.  i
18c10 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 6e 65  nt rc;..  /* One
18c20 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e   of these must n
18c30 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65  ot be NULL. Othe
18c40 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20  rwise, why call 
18c50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a  this function? *
18c60 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61 67  /.  assert(ppPag
18c70 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b  e || pPgnoNext);
18c80 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e  ..  /* If pPgnoN
18c90 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
18ca0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18cb0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
18cc0 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61  to obtain.  ** a
18cd0 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65   MemPage* refere
18ce0 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67  nce only. No pag
18cf0 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69 72  e-data is requir
18d00 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
18d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67  .  */.  if( !pPg
18d20 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65  noNext ){.    re
18d30 74 75 72 6e 20 67 65 74 50 61 67 65 28 70 42 74  turn getPage(pBt
18d40 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c 20  , ovfl, ppPage, 
18d50 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  1);.  }..#ifndef
18d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18d70 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
18d80 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
18d90 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
18da0 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
18db0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
18dc0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
18dd0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
18de0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
18df0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
18e00 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
18e10 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
18e20 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
18e30 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
18e40 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
18e50 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
18e60 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
18e70 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
18e80 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
18e90 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
18ea0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
18eb0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
18ec0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
18ed0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
18ee0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
18ef0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
18f00 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
18f10 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18f20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
18f30 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
18f40 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
18f50 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
18f60 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
18f70 73 73 3c 73 71 6c 69 74 65 33 50 61 67 65 72 50  ss<sqlite3PagerP
18f80 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
18f90 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
18fa0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
18fb0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
18fc0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
18fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
18ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19000 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
19010 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
19020 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
19030 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
19040 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
19050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
19060 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d  dif..  if( next=
19070 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a  =0 || ppPage ){.
19080 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
19090 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  ge = 0;..    rc 
190a0 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6f  = getPage(pBt, o
190b0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78  vfl, &pPage, nex
190c0 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72  t!=0);.    asser
190d0 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  t(rc==SQLITE_OK 
190e0 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20  || pPage==0);.  
190f0 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26    if( next==0 &&
19100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19110 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
19120 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
19130 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Data);.    }..  
19140 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
19150 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
19160 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65  pPage;.    }else
19170 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
19180 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
19190 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65  }.  }.  *pPgnoNe
191a0 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65  xt = next;..  re
191b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
191c0 2a 2a 20 52 65 61 64 20 70 61 79 6c 6f 61 64 20  ** Read payload 
191d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
191e0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
191f0 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
19200 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
19210 6f 2e 20 20 42 65 67 69 6e 20 72 65 61 64 69 6e  o.  Begin readin
19220 67 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 74  g the payload at
19230 20 22 6f 66 66 73 65 74 22 20 61 6e 64 20 72 65   "offset" and re
19240 61 64 0a 2a 2a 20 61 20 74 6f 74 61 6c 20 6f 66  ad.** a total of
19250 20 22 61 6d 74 22 20 62 79 74 65 73 2e 20 20 50   "amt" bytes.  P
19260 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  ut the result in
19270 20 7a 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   zBuf..**.** Thi
19280 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
19290 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
192a0 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
192b0 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
192c0 74 20 6a 75 73 74 20 72 65 61 64 73 20 62 79 74  t just reads byt
192d0 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c  es from the payl
192e0 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20  oad area.  Data 
192f0 6d 69 67 68 74 20 61 70 70 65 61 72 0a 2a 2a 20  might appear.** 
19300 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
19310 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
19320 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
19330 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
19340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
19350 65 74 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  etPayload(.  BtC
19360 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
19370 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
19380 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
19390 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
193a0 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20  int offset,     
193b0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
193c0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
193d0 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
193e0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
193f0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
19400 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
19410 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
19420 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
19430 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
19440 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
19450 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
19460 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
19470 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
19480 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
19490 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
194a0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
194b0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65  .  Pgno nextPage
194c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  ;.  int rc;.  Me
194d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
194e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
194f0 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 3b 0a 20   int ovflSize;. 
19500 20 75 33 32 20 6e 4b 65 79 3b 0a 0a 20 20 61 73   u32 nKey;..  as
19510 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
19520 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
19530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
19540 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19550 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 42 74  R_VALID );.  pBt
19560 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
19570 3e 70 42 74 3b 0a 20 20 70 50 61 67 65 20 3d 20  >pBt;.  pPage = 
19580 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
19590 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
195a0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
195b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
195c0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
195d0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
195e0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
195f0 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
19600 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
19610 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
19620 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
19630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
19640 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
19650 65 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ey;.  }.  assert
19660 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
19670 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
19680 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b      offset += nK
19690 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66  ey;.  }.  if( of
196a0 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b  fset+amt > nKey+
196b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
196c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
196d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
196e0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
196f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
19700 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
19710 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
19720 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
19730 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
19740 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
19750 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
19760 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
19770 28 70 42 75 66 2c 20 26 61 50 61 79 6c 6f 61 64  (pBuf, &aPayload
19780 5b 6f 66 66 73 65 74 5d 2c 20 61 29 3b 0a 20 20  [offset], a);.  
19790 20 20 69 66 28 20 61 3d 3d 61 6d 74 20 29 7b 0a    if( a==amt ){.
197a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
197b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
197c0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
197d0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
197e0 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
197f0 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
19800 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
19810 63 61 6c 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 53  cal;.  }.  ovflS
19820 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
19830 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28  eSize - 4;.  if(
19840 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 6e 65   amt>0 ){.    ne
19850 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
19860 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
19870 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
19880 0a 20 20 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  .    while( amt>
19890 30 20 26 26 20 6e 65 78 74 50 61 67 65 20 29 7b  0 && nextPage ){
198a0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
198b0 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
198c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
198d0 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
198e0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
198f0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
19900 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
19910 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
19920 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
19930 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 53 6f 20  rflow chain. So 
19940 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  try.        ** t
19950 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
19960 67 65 28 29 20 73 68 6f 72 74 63 75 74 2e 0a 20  ge() shortcut.. 
19970 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19980 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
19990 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
199a0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
199b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
199c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
199d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
199e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
199f0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
19a00 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
19a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
19a30 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
19a40 65 72 6c 79 2c 20 74 6f 20 6f 62 74 61 69 6e 20  erly, to obtain 
19a50 64 61 74 61 20 74 6f 20 63 6f 70 79 20 69 6e 74  data to copy int
19a60 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  o.        ** the
19a70 20 63 61 6c 6c 65 72 27 73 20 62 75 66 66 65 72   caller's buffer
19a80 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
19a90 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
19aa0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
19ab0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
19ac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19ad0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
19ae0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
19af0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
19b00 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
19b10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19b20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
19b30 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
19b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19b50 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
19b60 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
19b70 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
19b80 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oad);.        if
19b90 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
19ba0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
19bb0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
19bc0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
19bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
19be0 6d 63 70 79 28 70 42 75 66 2c 20 26 61 50 61 79  mcpy(pBuf, &aPay
19bf0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
19c00 61 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  a);.        offs
19c10 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
19c20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
19c30 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
19c40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19c50 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
19c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19c70 20 7d 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20   }..  if( amt>0 
19c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19c90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19ca0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
19cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19cc0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
19cd0 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
19ce0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
19cf0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
19d00 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
19d10 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
19d20 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
19d30 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
19d40 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
19d50 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
19d60 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
19d70 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
19d80 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
19d90 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
19da0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
19db0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
19dc0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
19dd0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
19de0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
19df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19e00 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
19e10 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
19e20 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
19e30 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
19e40 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
19e50 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
19e60 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
19e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19e80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
19e90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19ea0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
19eb0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
19ec0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
19ed0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
19ee0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
19ef0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19f00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
19f10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19f20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
19f30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19f40 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
19f50 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
19f60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
19f70 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 79 6c      rc = getPayl
19f80 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
19f90 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
19fa0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
19fb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19fd0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
19fe0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19ff0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1a000 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1a010 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1a020 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1a030 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1a040 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1a050 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1a060 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1a070 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1a080 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1a090 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1a0a0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
1a0b0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
1a0c0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
1a0d0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
1a0e0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
1a0f0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
1a100 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
1a110 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a120 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
1a130 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
1a140 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73  {.  int rc = res
1a150 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
1a160 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1a170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1a190 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1a1a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1a1b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1a1c0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
1a1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1a1e0 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
1a1f0 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
1a200 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1a210 72 63 20 3d 20 67 65 74 50 61 79 6c 6f 61 64 28  rc = getPayload(
1a220 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1a230 74 2c 20 70 42 75 66 2c 20 31 29 3b 0a 20 20 7d  t, pBuf, 1);.  }
1a240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a250 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1a260 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
1a270 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
1a280 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
1a290 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
1a2a0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1a2b0 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
1a2c0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
1a2d0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
1a2e0 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
1a2f0 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
1a300 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1a310 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
1a320 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
1a330 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a340 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
1a350 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
1a360 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
1a370 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
1a380 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
1a390 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
1a3a0 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
1a3b0 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
1a3c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
1a3d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
1a3e0 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
1a3f0 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
1a400 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
1a410 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
1a420 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
1a430 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
1a440 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
1a450 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
1a460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1a470 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
1a480 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
1a490 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
1a4a0 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
1a4b0 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
1a4c0 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
1a4d0 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
1a4e0 61 67 65 73 2c 20 74 68 65 6e 20 67 65 74 50 61  ages, then getPa
1a4f0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
1a500 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
1a510 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  ly.** the key/da
1a520 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
1a530 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
1a540 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
1a550 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
1a560 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
1a570 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
1a580 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
1a590 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
1a5a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1a5b0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
1a5c0 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
1a5d0 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
1a5e0 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
1a5f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1a600 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
1a610 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
1a620 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
1a630 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
1a640 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
1a650 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
1a660 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1a670 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
1a680 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1a690 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1a6a0 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
1a6b0 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
1a6c0 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
1a6d0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
1a6e0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1a6f0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
1a700 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1a710 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
1a720 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
1a730 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  int nLocal;..
1a740 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
1a750 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
1a760 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1a770 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a780 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a790 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1a7a0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
1a7b0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
1a7c0 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
1a7d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
1a7e0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1a7f0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1a800 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
1a810 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
1a820 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1a830 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1a840 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
1a850 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1a860 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
1a870 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1a880 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1a890 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1a8a0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1a8b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1a8c0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1a8d0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1a8e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1a8f0 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1a900 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1a910 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1a920 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1a930 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1a940 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1a950 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1a960 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1a970 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1a980 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1a990 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1a9a0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1a9b0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1a9c0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1a9d0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1a9e0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1a9f0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1aa00 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1aa10 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1aa20 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1aa30 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1aa40 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1aa50 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1aa60 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1aa70 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1aa80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
1aa90 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
1aaa0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
1aab0 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
1aac0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
1aad0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1aae0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
1aaf0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
1ab00 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
1ab10 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
1ab20 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
1ab30 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
1ab40 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
1ab50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ab60 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1ab70 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1ab80 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1ab90 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  , pAmt, 0);.  }.
1aba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f    return 0;.}.co
1abb0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1abc0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
1abd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1abe0 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69 66  int *pAmt){.  if
1abf0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ac00 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1ac10 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1ac20 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1ac30 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1ac40 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1ac50 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1ac60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1ac70 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1ac80 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1ac90 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1aca0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1acb0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1acc0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1acd0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1ace0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1acf0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1ad00 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1ad10 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1ad20 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50  pNewPage;.  MemP
1ad30 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20  age *pOldPage;. 
1ad40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ad50 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70   pCur->pBtree->p
1ad60 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
1ad70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ad80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
1ad90 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1ada0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1adb0 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72   &pNewPage, pCur
1adc0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  ->pPage);.  if( 
1add0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ade0 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50    pNewPage->idxP
1adf0 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64  arent = pCur->id
1ae00 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20  x;.  pOldPage = 
1ae10 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
1ae20 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66  OldPage->idxShif
1ae30 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  t = 0;.  release
1ae40 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a  Page(pOldPage);.
1ae50 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1ae60 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1ae70 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75  ->idx = 0;.  pCu
1ae80 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1ae90 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
1aea0 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20  e->nCell<1 ){.  
1aeb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aec0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1aed0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1aee0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1aef0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1af00 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76 69  e page is the vi
1af10 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74  rtual root of it
1af20 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  s table..**.** T
1af30 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
1af40 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  page is the root
1af50 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74   page for most t
1af60 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66  ables.  But.** f
1af70 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  or the table roo
1af80 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73  ted on page 1, s
1af90 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c  ometime the real
1afa0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
1afb0 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
1afc0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
1afd0 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61  ter.  In such ca
1afe0 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ses the.** virtu
1aff0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
1b000 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
1b010 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
1b020 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20  of page.** 1 is 
1b030 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
1b040 73 74 61 74 69 63 20 69 6e 74 20 69 73 52 6f 6f  static int isRoo
1b050 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
1b060 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
1b070 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67   *pParent = pPag
1b080 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
1b090 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
1b0a0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1b0b0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
1b0c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b0d0 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
1b0e0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
1b0f0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
1b100 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1b110 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1b120 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1b130 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
1b140 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
1b150 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
1b160 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
1b170 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
1b180 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
1b190 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1b1a0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1b1b0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1b1c0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1b1d0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1b1e0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1b1f0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1b200 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1b210 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1b220 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1b230 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
1b240 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
1b250 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1b260 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61  pParent;.  MemPa
1b270 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
1b280 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61   idxParent;..  a
1b290 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1b2a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1b2b0 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
1b2c0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
1b2d0 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
1b2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 52  ;.  assert( !isR
1b2f0 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29  ootPage(pPage) )
1b300 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
1b310 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
1b320 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1b330 3d 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e  =0 );.  idxParen
1b340 74 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61  t = pPage->idxPa
1b350 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50  rent;.  sqlite3P
1b360 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
1b370 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c  >pDbPage);.  rel
1b380 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1b390 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
1b3a0 20 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72   pParent;.  pCur
1b3b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1b3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1b3d0 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30  ent->idxShift==0
1b3e0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20   );.  pCur->idx 
1b3f0 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a  = idxParent;.}..
1b400 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1b410 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1b420 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1b430 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1b440 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b450 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1b460 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1b470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
1b480 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b490 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 0a 20  >pBtree->pBt;.. 
1b4a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b4b0 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e==CURSOR_REQUIR
1b4c0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 63 6c 65  ESEEK ){.    cle
1b4d0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
1b4e0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52  (pCur);.  }.  pR
1b4f0 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
1b500 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26  e;.  if( pRoot &
1b510 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  & pRoot->pgno==p
1b520 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  Cur->pgnoRoot ){
1b530 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1b540 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ot->isInit );.  
1b550 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a  }else{.    if( .
1b560 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21        SQLITE_OK!
1b570 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69  =(rc = getAndIni
1b580 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
1b590 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f  >pgnoRoot, &pRoo
1b5a0 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  t, 0)).    ){.  
1b5b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1b5c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1b5d0 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
1b5e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  rc;.    }.    re
1b5f0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1b600 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
1b610 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b  ->pPage = pRoot;
1b620 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78  .  }.  pCur->idx
1b630 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1b640 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1b650 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
1b660 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
1b670 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1b680 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73  subpage;.    ass
1b690 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1b6a0 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61  ==1 );.    subpa
1b6b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
1b6c0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
1b6d0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1b6e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75  ;.    assert( su
1b6f0 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70  bpage>0 );.    p
1b700 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1b710 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
1b720 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1b730 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
1b740 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
1b750 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70 50  ate = ((pCur->pP
1b760 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  age->nCell>0)?CU
1b770 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
1b780 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65  R_INVALID);.  re
1b790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b7a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b7b0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
1b7c0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
1b7d0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
1b7e0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
1b7f0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1b800 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
1b810 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
1b820 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
1b830 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
1b840 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
1b850 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
1b860 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1b870 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
1b880 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
1b890 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
1b8a0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  o;.  int rc;.  M
1b8b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1b8c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b8d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b8e0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
1b8f0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1b900 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
1b910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1b920 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
1b930 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
1b940 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
1b950 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1b960 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1b970 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d  >idx));.    rc =
1b980 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1b990 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
1b9a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b9b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1b9c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b9d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1b9e0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
1b9f0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
1ba00 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1ba10 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
1ba20 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1ba30 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
1ba40 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
1ba50 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
1ba60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
1ba70 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
1ba80 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
1ba90 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1baa0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
1bab0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1bac0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
1bad0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1bae0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
1baf0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
1bb00 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
1bb10 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
1bb20 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1bb30 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1bb40 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
1bb50 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
1bb60 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
1bb70 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1bb80 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
1bb90 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
1bba0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
1bbb0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  ;.  int rc;.  Me
1bbc0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1bbd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1bbe0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1bbf0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1bc00 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1bc10 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
1bc20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1bc30 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1bc40 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1bc50 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
1bc60 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1bc70 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1bc80 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1bc90 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1bca0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1bcb0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20    }.  pCur->idx 
1bcc0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  = pPage->nCell -
1bcd0 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   1;.  pCur->info
1bce0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 72 65  .nSize = 0;.  re
1bcf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bd00 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1bd10 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1bd20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1bd30 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1bd40 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1bd50 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1bd60 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1bd70 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1bd80 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1bd90 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1bda0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1bdb0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1bdc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bdd0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1bde0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1bdf0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1be00 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1be10 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1be20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
1be30 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1be40 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1be50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1be60 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1be70 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
1be80 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1be90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1bea0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1beb0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
1bec0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
1bed0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1bee0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1bef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1bf00 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1bf10 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1bf20 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1bf30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1bf40 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1bf50 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1bf60 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1bf70 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1bf80 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1bf90 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1bfa0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1bfb0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1bfc0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1bfd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1bfe0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1bff0 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  t rc;.  rc = mov
1c000 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1c010 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1c020 20 72 63 3b 0a 20 20 69 66 28 20 43 55 52 53 4f   rc;.  if( CURSO
1c030 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1c040 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 61  >eState ){.    a
1c050 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1c060 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1c070 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c090 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
1c0a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1c0b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1c0c0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1c0d0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1c0e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
1c0f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1c100 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1c110 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1c120 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1c130 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20  r pKey/nKey..** 
1c140 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
1c150 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
1c160 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
1c170 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61  only the nKey pa
1c180 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
1c190 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
1c1a0 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72  ored.  For other
1c1b0 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73   tables, nKey is
1c1c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c1d0 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20  ytes of data.** 
1c1e0 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63 6f  in pKey.  The co
1c1f0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1c200 6e 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  n specified when
1c210 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
1c220 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20 75 73  ** created is us
1c230 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65  ed to compare ke
1c240 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ys..**.** If an 
1c250 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1c260 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1c270 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1c280 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1c290 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1c2a0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1c2b0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1c2c0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1c2d0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1c2e0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1c2f0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1c300 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1c310 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1c320 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1c330 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
1c340 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1c350 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1c360 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
1c370 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
1c380 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20   if pRes!=NULL. 
1c390 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a   The meaning of.
1c3a0 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  ** this value is
1c3b0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1c3c0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
1c3d0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1c3e0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1c3f0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1c400 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1c410 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
1c420 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20  than pKey or if 
1c430 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1c440 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
1c450 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
1c460 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
1c470 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
1c480 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
1c490 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
1c4a0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1c4b0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1c4c0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
1c4f0 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  s pKey..**.**   
1c500 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1c510 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1c520 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1c530 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
1c560 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Key..*/.int sqli
1c570 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
1c580 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1c590 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1c5a0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1c5b0 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
1c5c0 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
1c5d0 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e  * The key conten
1c5e0 74 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20  t for indices.  
1c5f0 4e 6f 74 20 75 73 65 64 20 62 79 20 74 61 62 6c  Not used by tabl
1c600 65 73 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  es */.  i64 nKey
1c610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c620 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20  * Size of pKey. 
1c630 20 4f 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20   Or the key for 
1c640 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
1c650 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
1c660 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1c670 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1c680 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1c690 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1c6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1c6b0 61 72 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67  arch result flag
1c6c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1c6d0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1c6e0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1c6f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1c700 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c710 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1c720 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1c730 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1c740 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c750 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1c760 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1c770 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1c780 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1c790 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1c7a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c7b0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1c7c0 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1c7d0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1c7e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1c7f0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1c800 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20     int c = -1;  
1c810 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20 69  /* pRes return i
1c820 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  f table is empty
1c830 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20   must be -1 */. 
1c840 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
1c850 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
1c860 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21 70  ll-1;.    if( !p
1c870 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1c880 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
1c890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c8a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c8b0 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1c8c0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1c8d0 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1c8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c8f0 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72  pCur->idx = (upr
1c900 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +lwr)/2;.    }. 
1c910 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20     if( lwr<=upr 
1c920 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20  ) for(;;){.     
1c930 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1c940 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1c950 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1c960 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1c970 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1c980 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1c990 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1c9a0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1c9b0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1c9c0 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67  Cur->idx) + pPag
1c9d0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1c9e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1c9f0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1ca00 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1ca10 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1ca20 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1ca30 33 32 28 70 43 65 6c 6c 2c 20 26 64 75 6d 6d 79  32(pCell, &dummy
1ca40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ca50 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
1ca60 43 65 6c 6c 2c 20 28 75 36 34 20 2a 29 26 6e 43  Cell, (u64 *)&nC
1ca70 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1ca80 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b   if( nCellKey<nK
1ca90 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1caa0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1cab0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1cac0 65 79 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey>nKey ){.     
1cad0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
1cae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1caf0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
1cb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1cb10 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1cb20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20  available;.     
1cb30 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76     pCellKey = (v
1cb40 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f  oid *)fetchPaylo
1cb50 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61  ad(pCur, &availa
1cb60 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
1cb70 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72   nCellKey = pCur
1cb80 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
1cb90 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62       if( availab
1cba0 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a  le>=nCellKey ){.
1cbb0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43            c = pC
1cbc0 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43 75  ur->xCompare(pCu
1cbd0 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b 65  r->pArg, nCellKe
1cbe0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b 65  y, pCellKey, nKe
1cbf0 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
1cc00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cc10 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
1cc20 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
1cc30 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20  CellKey );.     
1cc40 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
1cc50 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
1cc60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1cc70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1cc80 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
1cc90 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76   0, nCellKey, (v
1cca0 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b  oid *)pCellKey);
1ccb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
1ccc0 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 28 70 43  Cur->xCompare(pC
1ccd0 75 72 2d 3e 70 41 72 67 2c 20 6e 43 65 6c 6c 4b  ur->pArg, nCellK
1cce0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 6e 4b  ey, pCellKey, nK
1ccf0 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
1cd00 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1cd10 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1cd20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1cd30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1cd40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1cd50 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1cd60 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1cd70 6c 65 61 66 44 61 74 61 20 26 26 20 21 70 50 61  leafData && !pPa
1cd80 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1cd90 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72        lwr = pCur
1cda0 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  ->idx;.         
1cdb0 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
1cdc0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1cdd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1cde0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
1cdf0 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a  es ) *pRes = 0;.
1ce00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ce10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ce20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ce30 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1ce40 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75         lwr = pCu
1ce50 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20  r->idx+1;.      
1ce60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
1ce70 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31  pr = pCur->idx-1
1ce80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ce90 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
1cea0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ceb0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
1cec0 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  ->idx = (lwr+upr
1ced0 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  )/2;.    }.    a
1cee0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
1cef0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1cf00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1cf10 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1cf20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
1cf30 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
1cf40 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
1cf50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1cf60 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
1cf70 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1cf80 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1cf90 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
1cfa0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
1cfb0 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
1cfc0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
1cfd0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1cfe0 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
1cff0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1d000 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
1d010 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61  r->idx<pCur->pPa
1d020 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1d030 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70     if( pRes ) *p
1d040 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
1d050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d060 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1d070 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20  >idx = lwr;.    
1d080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1d090 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
1d0a0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d0b0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
1d0c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
1d0d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d0e0 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43   }.  /* NOT REAC
1d0f0 48 45 44 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  HED */.}../*.** 
1d100 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1d110 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1d120 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1d130 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
1d140 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
1d150 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1d160 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
1d170 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1d180 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
1d190 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1d1a0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
1d1b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
1d1c0 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
1d1d0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1d1e0 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
1d1f0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1d200 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1d210 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d220 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
1d230 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
1d240 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
1d250 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
1d260 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
1d270 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
1d280 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
1d290 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
1d2a0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
1d2b0 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
1d2c0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1d2d0 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
1d2e0 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
1d2f0 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
1d300 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
1d310 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
1d320 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
1d330 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
1d340 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
1d350 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1d360 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1d370 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1d380 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1d390 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1d3a0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1d3b0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
1d3c0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1d3d0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
1d3e0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1d3f0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
1d400 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
1d410 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1d420 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1d430 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1d440 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
1d450 20 2a 70 50 61 67 65 3b 0a 0a 20 20 72 63 20 3d   *pPage;..  rc =
1d460 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
1d470 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1d480 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1d490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d4a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d4b0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
1d4c0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1d4d0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1d4e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1d4f0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1d500 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1d510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d520 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1d530 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1d540 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1d550 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1d560 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1d570 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1d580 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
1d590 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d5a0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1d5b0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70  ert( pCur->idx<p
1d5c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
1d5d0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
1d5e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1d5f0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
1d600 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  r->idx>=pPage->n
1d610 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
1d620 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1d630 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1d640 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
1d650 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d660 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d670 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
1d680 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1d690 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
1d6a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1d6b0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
1d6c0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1d6d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d6e0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
1d6f0 69 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  isRootPage(pPage
1d700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  ) ){.        *pR
1d710 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1d720 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d730 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d750 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1d760 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
1d770 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
1d780 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
1d790 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
1d7a0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1d7b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1d7c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d7d0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44  if( pPage->leafD
1d7e0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ata ){.      rc 
1d7f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1d800 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1d810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d830 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1d840 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1d850 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1d860 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d880 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1d890 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1d8a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d8b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
1d8c0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1d8d0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
1d8e0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
1d8f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
1d900 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
1d910 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
1d920 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
1d930 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
1d940 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
1d950 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1d960 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1d970 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1d980 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1d990 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1d9a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d9b0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1d9c0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d9d0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d9e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1d9f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1da00 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
1da10 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
1da20 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1da30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1da40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1da50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53  ;.  }.  if( CURS
1da60 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1da70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1da80 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
1da90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1daa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1dab0 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70  >skip<0 ){.    p
1dac0 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20  Cur->skip = 0;. 
1dad0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1dae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1daf0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
1db00 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61  skip = 0;..  pPa
1db10 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1db20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1db30 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1db40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1db50 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
1db60 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1db70 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1db80 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  ( findCell(pPage
1db90 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a  , pCur->idx) );.
1dba0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1dbb0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1dbc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1dbd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
1dbe0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1dbf0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
1dc00 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
1dc10 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20  ur->idx==0 ){.  
1dc20 20 20 20 20 69 66 28 20 69 73 52 6f 6f 74 50 61      if( isRootPa
1dc30 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20  ge(pPage) ){.   
1dc40 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1dc50 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1dc60 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
1dc70 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
1dc80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dc90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1dca0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1dcb0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1dcc0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1dcd0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1dce0 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x--;.    pCur->i
1dcf0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1dd00 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1dd10 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1dd20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1dd30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1dd40 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1dd50 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1dd60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1dd70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1dd80 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1dd90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dda0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
1ddb0 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
1ddc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1ddd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
1dde0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
1ddf0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
1de00 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
1de10 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1de20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1de30 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
1de40 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
1de50 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
1de60 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
1de70 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
1de80 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
1de90 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1dea0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
1deb0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
1dec0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
1ded0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
1dee0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1def0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
1df00 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
1df10 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
1df20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
1df30 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
1df40 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
1df50 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
1df60 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
1df70 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
1df80 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
1df90 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
1dfa0 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
1dfb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1dfc0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
1dfd0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
1dfe0 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
1dff0 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
1e000 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
1e010 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
1e020 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
1e030 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
1e040 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
1e050 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
1e060 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
1e070 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
1e080 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
1e090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
1e0a0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
1e0b0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
1e0c0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
1e0d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
1e0e0 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
1e0f0 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
1e100 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
1e110 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
1e120 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
1e130 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
1e140 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
1e150 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
1e160 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
1e170 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
1e180 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
1e190 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
1e1a0 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
1e1b0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1e1c0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
1e1d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
1e1e0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
1e1f0 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
1e200 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
1e210 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
1e220 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1e230 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
1e240 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   int n;     /* N
1e250 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
1e260 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
1e270 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f  /.  int k;     /
1e280 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
1e290 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
1e2a0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1e2b0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
1e2c0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
1e2d0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
1e2e0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 31 20 3d  = 0;..  pPage1 =
1e2f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1e300 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1e310 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1e320 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1e330 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1e340 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1e350 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1e360 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1e370 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1e380 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1e390 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1e3a0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1e3b0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1e3c0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1e3d0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1e3e0 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1e3f0 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1e400 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1e410 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1e420 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1e430 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1e440 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1e450 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1e460 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1e470 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1e480 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1e490 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1e4a0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1e4b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e4c0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1e4d0 74 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  t ){.      u8 eT
1e4e0 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ype;.      asser
1e4f0 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
1e500 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1e510 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
1e520 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1e530 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
1e540 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
1e550 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e560 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
1e570 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e580 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1e590 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1e5a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1e5b0 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62    *pPgno = nearb
1e5c0 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
1e5d0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
1e5e0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
1e5f0 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
1e600 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
1e610 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
1e620 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
1e630 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
1e640 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
1e650 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
1e660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e670 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1e680 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1e690 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e6a0 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
1e6b0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e6c0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
1e6d0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
1e6e0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
1e6f0 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
1e700 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
1e710 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
1e720 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
1e730 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
1e740 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1e750 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
1e760 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
1e770 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
1e780 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
1e790 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
1e7a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
1e7b0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
1e7c0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
1e7d0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1e7e0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1e7f0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1e800 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
1e810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e820 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1e830 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e840 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
1e850 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50  .      rc = getP
1e860 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
1e870 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
1e880 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e890 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1e8a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1e8b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e8c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1e8d0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
1e8e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
1e8f0 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
1e900 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
1e910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e920 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
1e930 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
1e940 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
1e950 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
1e960 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
1e970 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
1e980 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
1e990 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
1e9a0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
1e9b0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
1e9c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
1e9d0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
1e9e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e9f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
1ea00 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1ea10 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1ea20 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1ea30 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1ea40 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1ea50 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
1ea60 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
1ea70 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1ea80 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1ea90 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1eaa0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1eab0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1eac0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1ead0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1eae0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1eaf0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1eb00 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1eb10 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
1eb20 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e  else if( k>pBt->
1eb30 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
1eb40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
1eb50 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
1eb60 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
1eb70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1eb80 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1eb90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1eba0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
1ebb0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1ebc0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
1ebd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ebe0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
1ebf0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
1ec00 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
1ec10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1ec20 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
1ec30 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
1ec40 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
1ec50 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1ec60 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
1ec70 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
1ec80 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
1ec90 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
1eca0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1ecb0 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
1ecc0 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
1ecd0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
1ece0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1ecf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
1ed00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ed10 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
1ed20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1ed30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1ed40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1ed50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1ed60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1ed70 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
1ed80 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
1ed90 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1eda0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
1edb0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
1edc0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1edd0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
1ede0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1edf0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
1ee00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
1ee10 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1ee20 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1ee30 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1ee40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1ee50 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
1ee60 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1ee70 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
1ee80 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
1ee90 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
1eea0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
1eeb0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
1eec0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
1eed0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
1eee0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1eef0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1ef00 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
1ef10 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
1ef20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
1ef30 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1ef40 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1ef50 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  8]);.          r
1ef60 63 20 3d 20 67 65 74 50 61 67 65 28 70 42 74 2c  c = getPage(pBt,
1ef70 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
1ef80 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
1ef90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1efa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1efb0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1efc0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1efd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1efe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1eff0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
1f000 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f020 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f030 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1f040 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
1f050 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
1f060 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1f070 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1f080 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
1f090 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1f0a0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1f0b0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1f0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
1f0d0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
1f0e0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
1f0f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1f100 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1f110 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
1f120 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
1f130 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
1f140 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
1f150 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1f160 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
1f170 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
1f180 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1f190 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
1f1a0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1f1b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f1c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f1d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1f1e0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
1f1f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f200 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1f210 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f220 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f240 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1f250 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1f260 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
1f270 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1f280 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1f290 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1f2a0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1f2b0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1f2c0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1f2d0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1f2e0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
1f2f0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
1f300 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
1f310 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
1f320 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
1f330 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a     int closest;.
1f340 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
1f350 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
1f360 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
1f370 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
1f380 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f390 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f3a0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1f3b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f3c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1f3d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f3e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1f3f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
1f400 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
1f410 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a     int i, dist;.
1f420 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1f430 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1f440 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
1f450 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
1f460 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1f470 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
1f480 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
1f490 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
1f4a0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
1f4b0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
1f4c0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1f4d0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f4f0 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f510 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
1f520 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1f530 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
1f540 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
1f550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f580 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1f590 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f5a0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
1f5b0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
1f5c0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
1f5d0 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73    if( !searchLis
1f5e0 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72  t || iPage==near
1f5f0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
1f600 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
1f610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
1f620 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  Pgno>sqlite3Page
1f630 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1f640 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1f650 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70         /* Free p
1f660 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20  age off the end 
1f670 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1f680 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1f690 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f6a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1f6b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
1f6c0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f6d0 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
1f6e0 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
1f6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f700 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
1f710 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
1f730 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
1f740 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
1f750 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
1f760 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
1f770 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1f780 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
1f790 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
1f7a0 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
1f7b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f7c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f7d0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1f7e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
1f7f0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1f800 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  no, ppPage, 1);.
1f810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f830 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f840 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1f850 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ack((*ppPage)->p
1f860 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f880 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
1f890 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
1f8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f8b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f8d0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
1f8e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1f900 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
1f910 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1f920 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f930 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1f940 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
1f950 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
1f960 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
1f970 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
1f980 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
1f990 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
1f9a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
1f9b0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
1f9c0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
1f9d0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
1f9e0 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e 6f 20  e */.    *pPgno 
1f9f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1fa00 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1fa10 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66 6e 64  ger) + 1;..#ifnd
1fa20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1fa30 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1fa40 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b  ( pBt->nTrunc ){
1fa50 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63  .      /* An inc
1fa60 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72  r-vacuum has alr
1fa70 65 61 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20  eady run within 
1fa80 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1fa90 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  . So the.      *
1faa0 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61  * page to alloca
1fab0 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74  te is not from t
1fac0 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20  he physical end 
1fad0 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74  of the file, but
1fae0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74  .      ** at pBt
1faf0 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20  ->nTrunc. .     
1fb00 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f   */.      *pPgno
1fb10 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31   = pBt->nTrunc+1
1fb20 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
1fb30 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
1fb40 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1fb50 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
1fb60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fb70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1fb80 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
1fb90 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
1fba0 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
1fbb0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
1fbc0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
1fbd0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
1fbe0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
1fbf0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
1fc00 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
1fc10 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
1fc20 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
1fc30 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
1fc40 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
1fc50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1fc60 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
1fc70 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
1fc80 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
1fc90 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1fca0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
1fcb0 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
1fcc0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
1fcd0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
1fce0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1fcf0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fd00 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
1fd10 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
1fd20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1fd30 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1fd40 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
1fd50 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
1fd60 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
1fd70 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1fd80 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1fd90 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 50 61  ;.    rc = getPa
1fda0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1fdb0 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
1fdc0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1fdd0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
1fde0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
1fdf0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1fe00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1fe10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fe20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
1fe30 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
1fe40 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1fe50 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1fe60 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
1fe70 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
1fe80 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1fe90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fea0 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
1feb0 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
1fec0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1fed0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1fee0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1fef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ff00 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
1ff10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ff20 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
1ff30 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
1ff40 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
1ff50 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
1ff60 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
1ff70 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
1ff80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1ff90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ffa0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1ffb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1ffc0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1ffd0 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
1ffe0 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
1fff0 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
20000 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  g */.  assert( p
20010 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
20020 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
20030 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
20040 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ge(pPage->pParen
20050 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61  t);.  pPage->pPa
20060 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rent = 0;..  /* 
20070 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
20080 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
20090 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
200a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
200b0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
200c0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
200d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20   return rc;.  n 
200e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
200f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20100 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
20110 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
20120 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
20130 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
20140 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
20150 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
20160 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
20170 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
20180 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
20190 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
201a0 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
201b0 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
201c0 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  os..  */.  rc = 
201d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
201e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
201f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
20200 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65  turn rc;.  memse
20210 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
20220 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
20230 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66  ageSize);.#endif
20240 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20250 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20260 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
20270 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
20280 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
20290 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
202a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
202b0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
202c0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
202d0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
202e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
202f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
20300 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67  mapPut(pBt, pPag
20310 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  e->pgno, PTRMAP_
20320 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
20330 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20340 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
20350 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ..  if( n==0 ){.
20360 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
20370 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
20380 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ge */.    rc = s
20390 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
203a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
203b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
203c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65  eturn rc;.    me
203d0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
203e0 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75  a, 0, 8);.    pu
203f0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
20400 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65  aData[32], pPage
20410 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41  ->pgno);.    TRA
20420 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
20430 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61  %d first\n", pPa
20440 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
20450 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65  lse{.    /* Othe
20460 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72  r free pages alr
20470 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74  eady exist.  Ret
20480 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74  rive the first t
20490 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a  runk page.    **
204a0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
204b0 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f   and find out ho
204c0 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74  w many leaves it
204d0 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d   has. */.    Mem
204e0 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20  Page *pTrunk;.  
204f0 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
20500 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
20510 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
20520 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
20530 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20540 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67  rn rc;.    k = g
20550 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
20560 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
20570 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62  if( k>=pBt->usab
20580 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
20590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
205a0 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72  nk is full.  Tur
205b0 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  n the page being
205c0 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65   freed into a ne
205d0 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b  w.      ** trunk
205e0 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65   page with no le
205f0 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  aves. */.      r
20600 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20610 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
20620 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
20630 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20640 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20650 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54  pPage->aData, pT
20660 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  runk->pgno);.   
20670 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20680 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
20690 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
206a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
206b0 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
206c0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
206d0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
206e0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
206f0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20  placing %d\n",. 
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
20710 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b  ge->pgno, pTrunk
20720 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  ->pgno));.    }e
20730 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  lse{.      /* Ad
20740 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65  d the newly free
20750 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66  d page as a leaf
20760 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
20770 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72  trunk */.      r
20780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20790 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
207a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
207b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
207c0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
207d0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
207e0 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20  ta[4], k+1);.   
207f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20800 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b  Trunk->aData[8+k
20810 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  *4], pPage->pgno
20820 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20830 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
20840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20850 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
20860 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23  age->pDbPage);.#
20870 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
20880 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
20890 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
208a0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
208b0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
208c0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
208d0 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
208e0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
208f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20900 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
20910 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
20920 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20930 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
20940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
20950 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
20960 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
20970 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
20980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20990 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
209a0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
209b0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
209c0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
209d0 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  Ovfl;.  int ovfl
209e0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 70 61 72  PageSize;..  par
209f0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
20a00 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
20a10 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
20a20 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
20a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20a40 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
20a50 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
20a60 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
20a70 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f  thing */.  }.  o
20a80 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
20a90 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
20aa0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76  Overflow]);.  ov
20ab0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
20ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20ad0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
20ae0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
20af0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
20b00 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
20b10 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
20b20 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
20b30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
20b40 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
20b50 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
20b60 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f  pOvfl;.    if( o
20b70 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76  vflPgno==0 || ov
20b80 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  flPgno>sqlite3Pa
20b90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
20ba0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
20bb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20bc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20bd0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
20be0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
20bf0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
20c00 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
20c10 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
20c20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20c30 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
20c40 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
20c50 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
20c60 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
20c70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
20c80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20c90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20ca0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20cb0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
20cc0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
20cd0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
20ce0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
20cf0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
20d00 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
20d10 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
20d20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
20d30 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
20d40 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
20d50 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
20d60 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
20d70 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
20d80 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
20d90 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
20da0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
20db0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
20dc0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
20dd0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
20de0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
20df0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
20e00 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
20e10 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
20e20 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
20e30 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
20e40 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
20e50 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
20e60 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
20e70 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
20e80 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
20e90 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
20ea0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
20eb0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
20ec0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
20ed0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
20ee0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
20ef0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
20f00 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
20f10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
20f20 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
20f30 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
20f40 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
20f50 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
20f60 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
20f70 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
20f80 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
20f90 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
20fa0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
20fb0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20fd0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
20fe0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
20ff0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
21000 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
21010 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
21020 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
21030 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
21040 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
21050 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
21060 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
21070 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
21080 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
21090 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
210a0 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
210b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
210c0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
210d0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
210e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
210f0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21100 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
21110 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
21120 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
21130 66 6f 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  fo;..  /* Fill i
21140 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
21150 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
21160 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
21170 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
21180 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
21190 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
211a0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
211b0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
211c0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
211d0 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
211e0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
211f0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
21200 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
21210 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
21220 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
21230 6e 4b 65 79 29 3b 0a 20 20 70 61 72 73 65 43 65  nKey);.  parseCe
21240 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
21250 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
21260 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
21270 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
21280 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
21290 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
212a0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
212b0 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b  ==nData+nZero );
212c0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
212d0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
212e0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
212f0 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
21300 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
21310 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
21320 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
21330 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
21340 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
21350 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     nPayload += n
21360 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
21370 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
21380 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e   nKey;.  }.  *pn
21390 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
213a0 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
213b0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
213c0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
213d0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
213e0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
213f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
21400 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
21410 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
21420 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
21430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21440 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21450 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
21460 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
21470 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
21480 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
21490 72 79 20 70 61 67 65 20 2a 2f 0a 23 65 6e 64 69  ry page */.#endi
214a0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
214b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
214c0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
214d0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
214e0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
214f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21500 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
21510 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
21520 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
21530 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
21540 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
21550 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
21560 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
21570 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
21580 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
21590 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
215a0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
215b0 65 20 6e 6f 77 2e 20 54 68 65 20 65 6e 74 72 79  e now. The entry
215c0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6f   for the first o
215d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 77 69 6c  verflow page wil
215e0 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 64  l be.      ** ad
215f0 64 65 64 20 6c 61 74 65 72 2c 20 62 79 20 74 68  ded later, by th
21600 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 72  e insertCell() r
21610 6f 75 74 69 6e 65 2e 0a 20 20 20 20 20 20 2a 2f  outine..      */
21620 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
21630 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 70 67  autoVacuum && pg
21640 6e 6f 50 74 72 6d 61 70 21 3d 30 20 26 26 20 72  noPtrmap!=0 && r
21650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21660 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
21670 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
21680 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
21690 52 46 4c 4f 57 32 2c 20 70 67 6e 6f 50 74 72 6d  RFLOW2, pgnoPtrm
216a0 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ap);.      }.#en
216b0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
216c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
216d0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
216e0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
216f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
21700 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
21710 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
21720 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21730 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
21740 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
21750 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
21760 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
21770 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
21780 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
21790 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
217a0 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
217b0 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
217c0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
217d0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
217e0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
217f0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
21800 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
21810 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66  paceLeft;.    if
21820 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
21830 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
21840 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
21850 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
21860 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
21870 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
21880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21890 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
218a0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
218b0 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
218c0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
218d0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
218e0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
218f0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
21900 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
21910 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
21920 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
21930 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
21940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21950 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
21960 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
21970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21980 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d  .** Change the M
21990 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70  emPage.pParent p
219a0 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61  ointer on the pa
219b0 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20  ge whose number 
219c0 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74  is.** given in t
219d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
219e0 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61  nt so that MemPa
219f0 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  ge.pParent holds
21a00 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20   the.** pointer 
21a10 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67  in the third arg
21a20 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
21a30 20 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67   int reparentPag
21a40 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
21a50 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50   Pgno pgno, MemP
21a60 61 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c  age *pNewParent,
21a70 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d   int idx){.  Mem
21a80 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44  Page *pThis;.  D
21a90 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
21aa0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 50  .  assert( pNewP
21ab0 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  arent!=0 );.  if
21ac0 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  ( pgno==0 ) retu
21ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21ae0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
21af0 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50  ger!=0 );.  pDbP
21b00 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
21b10 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
21b20 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
21b30 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
21b40 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61    pThis = (MemPa
21b50 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
21b60 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
21b70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69  e);.    if( pThi
21b80 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  s->isInit ){.   
21b90 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73     assert( pThis
21ba0 2d 3e 61 44 61 74 61 3d 3d 28 73 71 6c 69 74 65  ->aData==(sqlite
21bb0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
21bc0 62 50 61 67 65 29 29 20 29 3b 0a 20 20 20 20 20  bPage)) );.     
21bd0 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72   if( pThis->pPar
21be0 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20  ent!=pNewParent 
21bf0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
21c00 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20  This->pParent ) 
21c10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
21c20 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  f(pThis->pParent
21c30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21c40 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65      pThis->pPare
21c50 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b  nt = pNewParent;
21c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21c70 50 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72  PagerRef(pNewPar
21c80 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
21c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68       }.      pTh
21ca0 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  is->idxParent = 
21cb0 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  idx;.    }.    s
21cc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
21cd0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  (pDbPage);.  }..
21ce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21cf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
21d00 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
21d10 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75  cuum ){.    retu
21d20 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74  rn ptrmapPut(pBt
21d30 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
21d40 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74  TREE, pNewParent
21d50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e  ->pgno);.  }.#en
21d60 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
21d70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
21d80 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50  ** Change the pP
21d90 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66  arent pointer of
21da0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
21db0 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20   pPage to point 
21dc0 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65  back.** to pPage
21dd0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
21de0 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72   words, for ever
21df0 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65  y child of pPage
21e00 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e  , invoke reparen
21e10 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61  tPage().** to ma
21e20 6b 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63  ke sure that eac
21e30 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68  h child knows th
21e40 61 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20  at pPage is its 
21e50 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  parent..**.** Th
21e60 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
21e70 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75  called after you
21e80 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61   memcpy() one pa
21e90 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68  ge into.** anoth
21ea0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
21eb0 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  t reparentChildP
21ec0 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  ages(MemPage *pP
21ed0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  age){.  int i;. 
21ee0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21ef0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
21f00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21f10 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  K;..  if( pPage-
21f20 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20 53  >leaf ) return S
21f30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72  QLITE_OK;..  for
21f40 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
21f50 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
21f60 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
21f70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
21f80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
21f90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
21fa0 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28   = reparentPage(
21fb0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
21fc0 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b  ell), pPage, i);
21fd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
21fe0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21ff0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
22000 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
22010 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  af ){.    rc = r
22020 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
22030 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22040 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
22050 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20  drOffset+8]), . 
22060 20 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b        pPage, i);
22070 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53  .    pPage->idxS
22080 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  hift = 0;.  }.  
22090 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
220a0 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
220b0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
220c0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
220d0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
220e0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
220f0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
22100 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
22110 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
22120 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
22130 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22140 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
22150 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
22160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
22170 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
22180 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
22190 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
221a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
221b0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
221c0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
221d0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
221e0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
221f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
22200 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29  int idx, int sz)
22210 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
22220 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
22230 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
22240 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
22250 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
22260 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
22270 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
22280 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
22290 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
222a0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
222b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
222c0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
222d0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
222e0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
222f0 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
22300 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
22310 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
22320 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
22330 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22340 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22350 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
22360 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
22370 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
22380 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
22390 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
223a0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
223b0 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
223c0 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
223d0 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
223e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
223f0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
22400 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
22410 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
22420 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
22430 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
22440 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
22450 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
22460 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
22470 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
22480 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
22490 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
224a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
224b0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
224c0 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
224d0 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
224e0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
224f0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
22500 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
22510 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
22520 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
22530 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
22540 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
22550 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
22560 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
22570 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
22580 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
22590 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
225a0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
225b0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
225c0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
225d0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
225e0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
225f0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
22600 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
22610 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
22620 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
22630 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
22640 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
22650 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
22660 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
22670 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
22680 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
22690 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
226a0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
226b0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
226c0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
226d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
226e0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
226f0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
22700 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
22710 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
22720 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
22730 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
22740 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
22750 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
22760 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
22770 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
22780 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
22790 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
227a0 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
227b0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
227c0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
227d0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
227e0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
227f0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
22800 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
22810 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
22820 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
22830 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
22840 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
22850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
22860 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
22870 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
22880 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
22890 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
228a0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
228b0 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
228c0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
228d0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
228e0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
228f0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
22900 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
22910 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
22920 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
22930 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
22940 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
22950 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
22960 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
22970 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
22980 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
22990 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
229a0 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
229b0 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
229c0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
229d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
229e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
229f0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
22a00 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
22a10 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
22a20 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
22a30 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
22a40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
22a50 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
22a60 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
22a70 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22a80 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
22a90 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
22aa0 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
22ab0 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
22ac0 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
22ad0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
22ae0 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
22af0 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
22b00 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
22b10 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
22b20 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
22b30 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
22b40 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
22b50 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
22b60 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
22b70 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
22b80 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
22b90 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
22ba0 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
22bb0 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
22bc0 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
22bd0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
22be0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
22bf0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
22c00 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
22c10 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
22c20 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
22c30 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22c40 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22c50 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
22c60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
22c70 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
22c80 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
22c90 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
22ca0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
22cb0 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
22cc0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
22cd0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
22ce0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
22cf0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
22d00 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
22d10 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
22d20 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
22d30 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
22d40 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
22d50 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
22d60 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
22d70 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
22d80 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
22d90 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
22da0 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
22db0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
22dc0 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
22dd0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
22de0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
22df0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
22e00 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
22e10 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
22e20 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
22e30 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
22e40 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
22e50 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
22e60 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
22e70 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
22e80 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
22e90 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
22ea0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
22eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22ec0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22ed0 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
22ee0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
22ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
22f00 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29  nd + sz <= top )
22f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20  ;.    }.    idx 
22f20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
22f30 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20  pPage, sz);.    
22f40 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b  assert( idx>0 );
22f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64  .    assert( end
22f60 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61   <= get2byte(&da
22f70 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
22f80 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
22f90 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
22fa0 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
22fb0 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
22fc0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
22fd0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
22fe0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
22ff0 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
23000 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
23010 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
23020 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
23030 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
23040 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
23050 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
23060 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
23070 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
23080 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
23090 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78  ;.    pPage->idx
230a0 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64  Shift = 1;.#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 20 20 69 66  UTOVACUUM.    if
230d0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
230e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
230f0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
23100 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
23110 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
23120 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
23130 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
23140 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
23150 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
23160 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
23170 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
23180 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
23190 6f 3b 0a 20 20 20 20 20 20 70 61 72 73 65 43 65  o;.      parseCe
231a0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
231b0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
231c0 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
231d0 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
231e0 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
231f0 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
23200 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  d );.      if( (
23210 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
23220 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
23230 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
23240 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  cal ){.        P
23250 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
23260 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
23270 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
23280 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
23290 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
232a0 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
232b0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
232c0 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
232d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
232e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
232f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
23300 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
23310 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
23320 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23330 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
23340 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
23350 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
23360 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
23370 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
23380 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
23390 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
233a0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
233b0 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
233c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
233d0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
233e0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
233f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
23400 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23410 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
23420 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
23430 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
23440 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
23450 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
23460 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  odies */.  int *
23470 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
23480 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
23490 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
234a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
234b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
234c0 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
234d0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
234e0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
234f0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
23500 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23510 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
23520 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
23530 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
23540 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
23550 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
23560 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
23570 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
23580 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
23590 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
235a0 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
235b0 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
235c0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
235d0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74 61  low==0 );.  tota
235e0 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72  lSize = 0;.  for
235f0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
23600 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69  ++){.    totalSi
23610 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a  ze += aSize[i];.
23620 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f    }.  assert( to
23630 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c  talSize+2*nCell<
23640 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b  =pPage->nFree );
23650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23660 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
23670 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d  cellptr = pPage-
23680 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64  >cellOffset;.  d
23690 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
236a0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
236b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
236c0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
236d0 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
236e0 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20   if( nCell ){.  
236f0 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c    cellbody = all
23700 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
23710 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20  , totalSize);.  
23720 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
23730 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dy>0 );.    asse
23740 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
23750 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20   >= 2*nCell );. 
23760 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
23770 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20  -= 2*nCell;.    
23780 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
23790 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75  ; i++){.      pu
237a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
237b0 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  lptr], cellbody)
237c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
237d0 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
237e0 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
237f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c  [i]);.      cell
23800 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ptr += 2;.      
23810 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a  cellbody += aSiz
23820 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e[i];.    }.    
23830 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
23840 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
23850 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  ableSize );.  }.
23860 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
23870 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nCell;.}../*.**
23880 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
23890 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
238a0 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
238b0 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
238c0 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
238d0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
238e0 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
238f0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
23900 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
23910 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
23920 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
23930 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
23940 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
23950 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
23960 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
23970 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
23980 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
23990 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
239a0 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
239b0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
239c0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
239d0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
239e0 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
239f0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
23a00 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
23a10 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
23a20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
23a30 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
23a40 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
23a50 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
23a60 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
23a70 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
23a80 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
23a90 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
23aa0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
23ab0 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
23ac0 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
23ad0 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
23ae0 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
23af0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23b00 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
23b10 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
23b20 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
23b30 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
23b40 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
23b50 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
23b60 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f  he balance */../
23b70 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
23b80 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
23b90 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67  t balance(MemPag
23ba0 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64  e*, int);..#ifnd
23bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
23bc0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
23bd0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
23be0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
23bf0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
23c00 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
23c10 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
23c20 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
23c30 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
23c40 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
23c50 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
23c60 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
23c70 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
23c80 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
23c90 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
23ca0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
23cb0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
23cc0 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
23cd0 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
23ce0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
23cf0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
23d00 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
23d10 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
23d20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
23d30 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
23d40 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
23d50 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
23d60 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
23d70 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
23d80 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
23d90 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
23da0 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
23db0 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
23dc0 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
23dd0 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
23de0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
23df0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
23e00 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
23e10 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
23e20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
23e30 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
23e40 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
23e50 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
23e60 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
23e70 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
23e80 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
23e90 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
23ea0 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
23eb0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
23ec0 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
23ed0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
23ee0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
23ef0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d  Page *pPage, Mem
23f00 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a  Page *pParent){.
23f10 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
23f20 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e  age *pNew;.  Pgn
23f30 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20  o pgnoNew;.  u8 
23f40 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73 7a  *pCell;.  int sz
23f50 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  Cell;.  CellInfo
23f60 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65   info;.  BtShare
23f70 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
23f80 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e  pBt;.  int paren
23f90 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e  tIdx = pParent->
23fa0 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72  nCell;   /* pPar
23fb0 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20  ent new divider 
23fc0 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
23fd0 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20  int parentSize; 
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77    /* Size of new
24000 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
24010 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c  .  u8 parentCell
24020 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [64];           
24030 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
24040 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  r the new divide
24050 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  r cell */..  /* 
24060 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
24070 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20  age. Insert the 
24080 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72  overflow cell fr
24090 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e  om pPage.  ** in
240a0 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f  to it. Then remo
240b0 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ve the overflow 
240c0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
240d0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
240e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
240f0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
24100 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  New, 0, 0);.  if
24110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24120 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24130 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20  ;.  }.  pCell = 
24140 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
24150 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20  pCell;.  szCell 
24160 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
24170 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a  age, pCell);.  z
24180 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50  eroPage(pNew, pP
24190 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  age->aData[0]);.
241a0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
241b0 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
241c0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  &szCell);.  pPag
241d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
241e0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
241f0 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  parent of the ne
24200 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
24210 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a  ge to pParent. *
24220 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e  /.  pNew->pParen
24230 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 73  t = pParent;.  s
24240 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
24250 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
24260 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
24270 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
24280 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50  ight-child of pP
24290 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68  arent. Change th
242a0 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  is.  ** so that 
242b0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
242c0 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  is the new page 
242d0 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20  allocated above 
242e0 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20 69  and.  ** pPage i
242f0 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69  s the next-to-ri
24300 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2f  ght child. .  */
24310 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24320 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70  ->nCell>0 );.  p
24330 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
24340 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
24350 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
24360 31 29 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63  1), &info);.  rc
24370 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
24380 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
24390 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
243a0 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e   0, 0, 0, &paren
243b0 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  tSize);.  if( rc
243c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
243d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
243e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65  }.  assert( pare
243f0 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72  ntSize<64 );.  r
24400 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
24410 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
24420 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
24430 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
24440 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
24460 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75  urn rc;.  }.  pu
24470 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
24480 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
24490 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
244a0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34  e->pgno);.  put4
244b0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
244c0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
244d0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
244e0 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  New);..#ifndef S
244f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24500 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
24510 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
24520 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
24530 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
24540 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20  r map.  ** with 
24550 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
24560 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
24570 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
24580 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  he .  ** cell on
24590 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
245a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
245b0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
245c0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
245d0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
245e0 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
245f0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
24600 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
24610 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24620 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
24630 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24640 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
24650 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
24660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
24680 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
24690 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
246a0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
246b0 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
246c0 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20  age and balance 
246d0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
246e0 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
246f0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
24700 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
24710 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
24720 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  full..  */.  rel
24730 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
24740 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
24750 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a  (pParent, 0);.}.
24760 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
24770 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
24780 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  CE */../*.** The
24790 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 6d 61   ISAUTOVACUUM ma
247a0 63 72 6f 20 69 73 20 75 73 65 64 20 77 69 74 68  cro is used with
247b0 69 6e 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  in balance_nonro
247c0 6f 74 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  ot() to determin
247d0 65 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  e.** if the data
247e0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
247f0 74 6f 2d 76 61 63 75 75 6d 20 6f 72 20 6e 6f 74  to-vacuum or not
24800 2e 20 42 65 63 61 75 73 65 20 69 74 20 69 73 20  . Because it is 
24810 75 73 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 61  used.** within a
24820 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
24830 74 20 69 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  t is an argument
24840 20 74 6f 20 61 6e 6f 74 68 65 72 20 6d 61 63 72   to another macr
24850 6f 20 0a 2a 2a 20 28 73 71 6c 69 74 65 4d 61 6c  o .** (sqliteMal
24860 6c 6f 63 52 61 77 29 2c 20 69 74 20 69 73 20 6e  locRaw), it is n
24870 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
24880 73 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  se conditional c
24890 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2a 20 53  ompilation..** S
248a0 6f 2c 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  o, this macro is
248b0 20 64 65 66 69 6e 65 64 20 69 6e 73 74 65 61 64   defined instead
248c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
248d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
248e0 55 55 4d 0a 23 64 65 66 69 6e 65 20 49 53 41 55  UUM.#define ISAU
248f0 54 4f 56 41 43 55 55 4d 20 28 70 42 74 2d 3e 61  TOVACUUM (pBt->a
24900 75 74 6f 56 61 63 75 75 6d 29 0a 23 65 6c 73 65  utoVacuum).#else
24910 0a 23 64 65 66 69 6e 65 20 49 53 41 55 54 4f 56  .#define ISAUTOV
24920 41 43 55 55 4d 20 30 0a 23 65 6e 64 69 66 0a 0a  ACUUM 0.#endif..
24930 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
24940 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
24950 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20   Cells on pPage 
24960 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73  and up to NN*2 s
24970 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50  iblings.** of pP
24980 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  age so that all 
24990 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
249a0 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74   the same amount
249b0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a   of free space..
249c0 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69  ** Usually NN si
249d0 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
249e0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69   side of pPage i
249f0 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  s used in the ba
24a00 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75  lancing,.** thou
24a10 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73  gh more siblings
24a20 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
24a30 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61   one side if pPa
24a40 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  ge is the first.
24a50 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  ** or last child
24a60 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
24a70 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65   If pPage has fe
24a80 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69  wer than 2*NN si
24a90 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74  blings.** (somet
24aa0 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
24ab0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50  nly happen if pP
24ac0 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
24ad0 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68  page or a .** ch
24ae0 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65  ild of root) the
24af0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
24b00 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69  siblings partici
24b10 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
24b20 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
24b30 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
24b40 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67  ngs of pPage mig
24b50 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
24b60 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
24b70 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e  one or.** two in
24b80 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
24b90 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
24ba0 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
24bb0 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74  r full. The root
24bc0 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63   page.** is spec
24bd0 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77  ial and is allow
24be0 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20  ed to be nearly 
24bf0 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20  empty. If pPage 
24c00 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  is .** the root 
24c10 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64  page, then the d
24c20 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
24c30 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
24c40 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61  sed.** or decrea
24c50 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e  sed by one, as n
24c60 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65  ecessary, to kee
24c70 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  p the root page 
24c80 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76  from being.** ov
24c90 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65  erfull or comple
24ca0 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  tely empty..**.*
24cb0 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
24cc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24cd0 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
24ce0 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50   the Cells on pP
24cf0 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
24d00 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
24d10 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  red in pPage->aD
24d20 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e  ata[].  This can
24d30 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
24d40 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
24d50 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65  ll.  Part of the
24d60 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
24d70 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61  tine is to.** ma
24d80 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c  ke sure all Cell
24d90 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65  s for pPage once
24da0 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50   again fit in pP
24db0 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a  age->aData[]..**
24dc0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
24dd0 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
24de0 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  he siblings of p
24df0 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74  Page, the parent
24e00 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   of pPage.** mig
24e10 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ht become overfu
24e20 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
24e30 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e    If that happen
24e40 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
24e50 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
24e60 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
24e70 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   the parent..**.
24e80 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
24e90 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
24ea0 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
24eb0 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
24ec0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
24ed0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53  rupted state.  S
24ee0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
24ef0 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
24f00 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
24f10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
24f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
24f30 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65  lance_nonroot(Me
24f40 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
24f50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
24f60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
24f70 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
24f80 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
24f90 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
24fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24fb0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
24fc0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
24fd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24fe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24ff0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
25000 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
25010 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
25020 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
25030 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
25040 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
25050 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25070 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
25080 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
25090 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
250c0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
250d0 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
25100 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
25110 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
25140 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
25170 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
25180 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
25190 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
251a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
251b0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
251c0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
251d0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
251e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
251f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
25200 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
25210 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
25220 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
25230 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
25240 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
25250 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
25260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25270 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
25280 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
25290 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
252a0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
252b0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
252c0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
252d0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
252e0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
252f0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
25300 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
25310 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
25320 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
25330 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
25340 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
25350 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
25360 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
25370 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20 3d  /.  int iSpace =
25380 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25390 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
253a0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 5b   byte of aSpace[
253b0 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
253c0 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
253d0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
253e0 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
253f0 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
25400 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  noOld[NB];      
25410 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
25420 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
25430 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  age in apOld[] *
25440 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
25450 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
25460 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
25470 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
25480 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
25490 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
254a0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
254b0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
254c0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
254d0 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  cing */.  Pgno p
254e0 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  gnoNew[NB+2];   
254f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
25500 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
25510 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20  page in apNew[] 
25520 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
25530 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  B];             
25540 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
25550 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
25560 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
25570 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
25580 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
25590 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
255a0 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
255b0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
255c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
255d0 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
255e0 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
255f0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
25600 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25620 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
25630 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
25640 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  t *szCell;      
25650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
25660 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
25670 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
25680 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79  ] */.  u8 *aCopy
25690 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
256a0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
256b0 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
256c0 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
256d0 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20 20  8 *aSpace;      
256e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
256f0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70  pace to hold cop
25700 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
25710 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66  cells */.#ifndef
25720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25730 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61 46  OVACUUM.  u8 *aF
25740 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
25750 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
25760 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
25770 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25780 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
25790 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
257a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
257b0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
257c0 67 65 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ge) );.  pBt = p
257d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
257e0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
257f0 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
25800 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
25810 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
25820 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25830 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
25840 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
25850 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25860 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
25870 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
25880 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
25890 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
258a0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
258b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
258c0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
258d0 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
258e0 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
258f0 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
25900 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
25910 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
25920 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
25930 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
25940 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
25950 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
25960 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
25970 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
25980 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
25990 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
259a0 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
259b0 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
259c0 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
259d0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
259e0 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
259f0 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
25a00 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
25a10 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
25a20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
25a30 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
25a40 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
25a50 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
25a60 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
25a70 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
25a80 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
25a90 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66       pPage->leaf
25aa0 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50  Data &&.      pP
25ab0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
25ac0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
25ad0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
25ae0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
25af0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
25b00 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
25b10 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
25b20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
25b30 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
25b40 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
25b50 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a  gno.  ){.    /*.
25b60 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65      ** TODO: Che
25b70 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ck the siblings 
25b80 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70  to the left of p
25b90 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Page. It may be 
25ba0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79  that.    ** they
25bb0 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e   are not full an
25bc0 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73  d no new page is
25bd0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
25be0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c  /.    return bal
25bf0 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65  ance_quick(pPage
25c00 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
25c10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
25c20 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20  * Find the cell 
25c30 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
25c40 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68  ge whose left ch
25c50 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a  ild points back.
25c60 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20    ** to pPage.  
25c70 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62  The "idx" variab
25c80 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  le is the index 
25c90 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49  of that cell.  I
25ca0 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20  f pPage.  ** is 
25cb0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68  the rightmost ch
25cc0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ild of pParent t
25cd0 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70  hen set idx to p
25ce0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20  Parent->nCell . 
25cf0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e   */.  if( pParen
25d00 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20  t->idxShift ){. 
25d10 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
25d20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e    pgno = pPage->
25d30 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
25d40 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ( pgno==sqlite3P
25d50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
25d60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
25d70 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b  ;.    for(idx=0;
25d80 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
25d90 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20  ell; idx++){.   
25da0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
25db0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
25dc0 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b  , idx))==pgno ){
25dd0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25df0 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
25e00 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20  arent->nCell.   
25e10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74            || get
25e20 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
25e30 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
25e40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67  drOffset+8])==pg
25e50 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no );.  }else{. 
25e60 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e     idx = pPage->
25e70 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a  idxParent;.  }..
25e80 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61    /*.  ** Initia
25e90 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73  lize variables s
25ea0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
25eb0 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20  e safe to jump. 
25ec0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
25ed0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20  balance_cleanup 
25ee0 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20  at any moment.. 
25ef0 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65   */.  nOld = nNe
25f00 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  w = 0;.  sqlite3
25f10 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
25f20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  ->pDbPage);..  /
25f30 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c  *.  ** Find sibl
25f40 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61  ing pages to pPa
25f50 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73  ge and the cells
25f60 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74   in pParent that
25f70 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65   divide.  ** the
25f80 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61   siblings.  An a
25f90 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
25fa0 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
25fb0 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a  gs on either.  *
25fc0 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  * side of pPage.
25fd0 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20    More siblings 
25fe0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
25ff0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
26000 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20  , if.  ** pPage 
26010 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
26020 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
26030 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
26040 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a  de.  If pParent.
26050 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
26060 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
26070 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
26080 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
26090 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44  aken..  */.  nxD
260a0 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20  iv = idx - NN;. 
260b0 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20   if( nxDiv + NB 
260c0 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  > pParent->nCell
260d0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
260e0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d  pParent->nCell -
260f0 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69   NB + 1;.  }.  i
26100 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20  f( nxDiv<0 ){.  
26110 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
26120 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66  .  nDiv = 0;.  f
26130 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b  or(i=0, k=nxDiv;
26140 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29   i<NB; i++, k++)
26150 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72  {.    if( k<pPar
26160 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
26170 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
26180 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
26190 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b   k);.      nDiv+
261a0 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
261b0 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20   !pParent->leaf 
261c0 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  );.      pgnoOld
261d0 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61  [i] = get4byte(a
261e0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  pDiv[i]);.    }e
261f0 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65  lse if( k==pPare
26200 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
26210 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
26220 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
26230 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
26240 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
26250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26270 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
26280 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
26290 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69  Old[i], &apOld[i
262a0 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  ], pParent);.   
262b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
262c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
262d0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64      apOld[i]->id
262e0 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20  xParent = k;.   
262f0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a   apCopy[i] = 0;.
26300 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
26310 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b  Old );.    nOld+
26320 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73  +;.    nMaxCells
26330 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
26340 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
26350 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a  nOverflow;.  }..
26360 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
26370 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
26380 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 2 in order to 
26390 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
263a0 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
263b0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
263c0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31 29 26  (nMaxCells + 1)&
263d0 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~1;..  /*.  ** A
263e0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
263f0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
26400 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c  res.  */.  apCel
26410 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
26420 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e 4d 61  Raw( .       nMa
26430 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
26440 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26460 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
26470 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
26480 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20 20  f(int)          
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
264b0 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65     + ROUND8(size
264c0 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42 20  of(MemPage))*NB 
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f       /* aCopy */
264f0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
26500 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20 20  eSize*(5+NB)    
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26520 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
26530 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  e */.     + (ISA
26540 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
26550 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20 20  Cells : 0)      
26560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
26570 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  From */.  );.  i
26580 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
26590 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
265a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
265b0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
265c0 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
265d0 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (int*)&apCell[nM
265e0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
265f0 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
26600 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
26610 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
26620 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[0] - (u8*)apCe
26630 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
26640 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
26650 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
26660 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
26670 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
26680 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
26690 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
266a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
266b0 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
266c0 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
266d0 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
266e0 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
266f0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
26700 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
26710 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b  aSpace = &aCopy[
26720 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
26730 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
26740 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
26750 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
26760 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
26770 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
26780 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
26790 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64  equired */.#ifnd
267a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
267b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
267c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
267d0 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
267e0 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61  aSpace[5*pBt->pa
267f0 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e  geSize];.  }.#en
26800 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  dif.  .  /*.  **
26810 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
26820 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
26830 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  Page and its sib
26840 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b  lings into aOld[
26850 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74  ]..  ** The rest
26860 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
26870 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
26880 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
26890 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74  rather.  ** that
268a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
268b0 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
268c0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
268d0 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  l be in the.  **
268e0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
268f0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20  g overwritten.. 
26900 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
26910 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
26920 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70   MemPage *p = ap
26930 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
26940 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b 70 42  ge*)&aCopy[i][pB
26950 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
26960 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
26970 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
26980 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65 6d 63  eSize];.    memc
26990 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f  py(p->aData, apO
269a0 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
269b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 73 69  t->pageSize + si
269c0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
269d0 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 63 70      /* The memcp
269e0 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e 67 65  y() above change
269f0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  s the value of p
26a00 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20 68 61  ->aData so we ha
26a10 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 74  ve to.    ** set
26a20 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20   it again. */.  
26a30 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26 28 28    p->aData = &((
26a40 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70 61 67  u8*)p)[-pBt->pag
26a50 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize];.  }..  /
26a60 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
26a70 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
26a80 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
26a90 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
26aa0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
26ab0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
26ac0 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
26ad0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
26ae0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
26af0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
26b00 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70  btained form aSp
26b10 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ace[] and remove
26b20 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
26b30 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
26b40 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
26b50 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
26b60 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
26b70 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
26b80 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
26b90 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
26ba0 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
26bb0 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
26bc0 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
26bd0 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
26be0 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e 20   into aSpace[]. 
26bf0 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
26c00 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
26c10 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
26c20 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
26c30 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
26c40 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
26c50 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
26c60 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
26c70 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
26c80 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
26c90 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
26ca0 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
26cb0 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
26cc0 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
26cd0 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
26ce0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
26cf0 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
26d00 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
26d10 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
26d20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
26d30 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
26d40 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
26d50 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
26d60 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
26d70 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
26d80 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
26d90 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
26da0 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d 3e  fData && pPage->
26db0 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  leaf;.  for(i=0;
26dc0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
26dd0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
26de0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
26df0 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
26e00 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
26e10 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
26e20 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
26e30 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
26e40 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
26e50 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
26e60 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
26e70 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
26e80 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
26e90 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
26ea0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
26eb0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
26ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26ed0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26ee0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
26ef0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
26f00 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20       int a;.    
26f10 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
26f20 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f   = i;.        fo
26f30 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e  r(a=0; a<pOld->n
26f40 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a  Overflow; a++){.
26f50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
26f60 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65  ld->aOvfl[a].pCe
26f70 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ll==apCell[nCell
26f80 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
26f90 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
26fa0 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20 20  0xFF;.          
26fb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26fd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26fe0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
26ff0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c   }.    if( i<nOl
27000 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  d-1 ){.      int
27010 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
27020 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
27030 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
27040 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
27050 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20      /* With the 
27060 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70  LEAFDATA flag, p
27070 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c  Parent cells hol
27080 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74  d only INTKEYs t
27090 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
270a0 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
270b0 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69   keys on the chi
270c0 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65  ld pages.  We ne
270d0 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20  ed to remove.   
270e0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69       ** the divi
270f0 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  der cells from p
27100 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20  Parent, but the 
27110 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61  dividers cells a
27120 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  re not.        *
27130 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c  * added to apCel
27140 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65 79  l[] because they
27150 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
27160 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a  of child cells..
27170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27180 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
27190 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b  ent, nxDiv, sz);
271a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
271b0 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
271c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
271d0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
271e0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65   );.        szCe
271f0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
27200 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
27210 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
27220 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
27230 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
27240 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
27250 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
27260 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
27270 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
27280 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
27290 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
272a0 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
272b0 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ion;.#ifndef SQL
272c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
272d0 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
272e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
272f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72  ){.          aFr
27300 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46  om[nCell] = 0xFF
27310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
27320 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  if.        dropC
27330 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
27340 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  iv, sz);.       
27350 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
27360 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  = leafCorrection
27370 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27380 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70  ( get4byte(pTemp
27390 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b  )==pgnoOld[i] );
273a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f  .        if( !pO
273b0 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
273c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
273d0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
273e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
273f0 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
27400 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
27410 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
27420 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
27430 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
27440 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
27450 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ll */.          
27460 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
27470 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
27480 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  ta[pOld->hdrOffs
27490 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  et+8], 4);.     
274a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
274b0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
274c0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
274d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
274e0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
274f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27500 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
27510 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
27520 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
27530 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
27540 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
27550 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
27560 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
27570 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
27580 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
27590 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
275a0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
275b0 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
275c0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
275d0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
275e0 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
275f0 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
27600 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
27610 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
27620 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
27630 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
27640 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
27650 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
27660 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
27670 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
27680 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
27690 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
276a0 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
276b0 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
276c0 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
276d0 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
276e0 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
276f0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
27700 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
27710 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
27720 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
27730 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
27740 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
27750 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
27760 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
27770 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
27780 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
27790 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
277a0 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
277b0 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
277c0 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
277d0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
277e0 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
277f0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
27800 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
27810 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
27820 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
27830 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
27840 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
27850 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
27860 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
27870 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
27880 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
27890 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
278a0 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
278b0 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
278c0 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
278d0 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  k++;.    }.  }. 
278e0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
278f0 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
27900 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
27910 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
27920 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
27930 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
27940 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
27950 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
27960 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
27970 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
27980 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
27990 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
279a0 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
279b0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
279c0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
279d0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
279e0 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
279f0 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
27a00 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
27a10 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
27a20 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
27a30 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
27a40 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
27a50 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
27a60 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
27a70 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
27a80 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
27a90 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
27aa0 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
27ab0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
27ac0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
27ad0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
27ae0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
27af0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
27b00 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
27b10 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
27b20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
27b30 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
27b40 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
27b50 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
27b60 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
27b70 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
27b80 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
27b90 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
27ba0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
27bb0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
27bc0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
27bd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
27be0 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
27bf0 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
27c00 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
27c30 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
27c40 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
27c50 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
27c60 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
27c70 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
27c80 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
27c90 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
27ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
27cb0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27cc0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
27cd0 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
27ce0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
27cf0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
27d00 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
27d10 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
27d20 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
27d30 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
27d40 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
27d50 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
27d60 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
27d70 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
27d80 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
27d90 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
27da0 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
27db0 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
27dc0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
27dd0 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
27de0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
27df0 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
27e00 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20   or we are the. 
27e10 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
27e20 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
27e30 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
27e40 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
27e50 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
27e60 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
27e70 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
27e80 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
27e90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
27ea0 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70  ntNew[0]>0 || (p
27eb0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20  Parent->pgno==1 
27ec0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
27ed0 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  l==0) );..  /*. 
27ee0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
27ef0 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
27f00 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
27f10 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
27f20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27f30 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67  >pgno>1 );.  pag
27f40 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e  eFlags = pPage->
27f50 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
27f60 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
27f70 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
27f80 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
27f90 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
27fa0 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
27fb0 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e  ld[i];.      pgn
27fc0 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c  oNew[i] = pgnoOl
27fd0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
27fe0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
27ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28000 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
28010 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
28020 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
28030 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
28040 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
28050 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
28060 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
28070 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
28080 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
28090 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20  w, &pgnoNew[i], 
280a0 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29  pgnoNew[i-1], 0)
280b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
280c0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
280d0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
280e0 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
280f0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
28100 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  }.    zeroPage(p
28110 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
28120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
28130 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
28140 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
28150 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
28160 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
28170 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20  <nOld ){.    rc 
28180 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64  = freePage(apOld
28190 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
281a0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
281b0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
281c0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
281d0 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
281e0 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
281f0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
28200 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
28210 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
28220 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
28230 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
28240 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
28250 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
28260 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
28270 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
28280 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
28290 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
282a0 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
282b0 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
282c0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
282d0 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
282e0 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
282f0 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
28300 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
28310 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
28320 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
28330 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
28340 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
28350 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
28360 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
28370 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
28380 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
28390 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
283a0 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
283b0 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
283c0 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
283d0 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
283e0 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
283f0 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
28400 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
28410 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
28420 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
28430 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f   int minV = pgno
28440 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  New[i];.    int 
28450 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
28460 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
28470 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67  +){.      if( pg
28480 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e  noNew[j]<(unsign
28490 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
284a0 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
284b0 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f       minV = pgno
284c0 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a  New[j];.      }.
284d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
284e0 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
284f0 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
28500 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
28510 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
28520 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
28530 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28540 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69  [i] = pgnoNew[mi
28550 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
28560 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
28570 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28580 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20  [minI] = t;.    
28590 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
285a0 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
285b0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
285c0 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20   old: %d %d %d  
285d0 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
285e0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
285f0 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
28600 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20  pgnoOld[0], .   
28610 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f   nOld>=2 ? pgnoO
28620 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ld[1] : 0,.    n
28630 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=3 ? pgnoOld
28640 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e  [2] : 0,.    pgn
28650 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30  oNew[0], szNew[0
28660 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
28670 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c   pgnoNew[1] : 0,
28680 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
28690 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
286a0 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32  w>=3 ? pgnoNew[2
286b0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  ] : 0, nNew>=3 ?
286c0 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
286d0 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e     nNew>=4 ? pgn
286e0 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[3] : 0, nNe
286f0 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
28700 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
28710 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20   ? pgnoNew[4] : 
28720 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
28730 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
28740 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
28750 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
28760 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
28770 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
28780 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
28790 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
287a0 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
287b0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
287c0 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
287d0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
287e0 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
287f0 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
28800 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
28810 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
28820 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
28830 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
28840 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28850 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e  New->pgno==pgnoN
28860 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73  ew[i] );.    ass
28870 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
28880 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
28890 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
288a0 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
288b0 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
288c0 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
288d0 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
288e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
288f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
28900 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28910 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28920 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  M.    /* If this
28930 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
28940 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
28950 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
28960 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
28970 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
28980 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68   the siblings th
28990 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67  at were rearrang
289a0 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65  ed. These can be
289b0 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68  : left.    ** ch
289c0 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c  ildren of cells,
289d0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
289e0 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72   of the page, or
289f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
28a00 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74      ** pointed t
28a10 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20  o by cells..    
28a20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
28a30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
28a40 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63      for(k=j; k<c
28a50 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a  ntNew[i]; k++){.
28a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28a70 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  k<nMaxCells );. 
28a80 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d         if( aFrom
28a90 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [k]==0xFF || apC
28aa0 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70  opy[aFrom[k]]->p
28ab0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
28ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
28ad0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
28ae0 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20  pNew, k-j);.    
28af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28b10 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
28b20 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28b40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28b50 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d  .#endif..    j =
28b60 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
28b70 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
28b80 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
28b90 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
28ba0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
28bb0 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
28bc0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
28bd0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
28be0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
28bf0 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
28c00 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
28c10 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
28c20 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
28c30 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
28c40 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
28c50 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
28c60 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
28c70 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
28c80 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
28c90 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
28ca0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
28cb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
28cc0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
28cd0 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
28ce0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
28cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
28d00 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
28d10 7b 0a 09 2f 2a 20 49 66 20 74 68 65 20 74 72 65  {../* If the tre
28d20 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
28d30 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
28d40 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
28d50 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
28d60 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
28d70 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
28d80 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
28d90 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
28da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
28db0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
28dc0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
28dd0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
28de0 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
28df0 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
28e00 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
28e10 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
28e20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
28e30 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
28e40 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
28e50 20 20 70 61 72 73 65 43 65 6c 6c 50 74 72 28 70    parseCellPtr(p
28e60 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
28e70 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
28e80 70 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b  pCell = &aSpace[
28e90 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20  iSpace];.       
28ea0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
28eb0 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
28ec0 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
28ed0 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
28ee0 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20   iSpace += sz;. 
28ef0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
28f00 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65  Space<=pBt->page
28f10 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20  Size*5 );.      
28f20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
28f30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f40 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
28f50 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
28f60 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20  Space[iSpace];. 
28f70 20 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d         iSpace +=
28f80 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
28f90 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74  ert( iSpace<=pBt
28fa0 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a  ->pageSize*5 );.
28fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
28fc0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
28fd0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
28fe0 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
28ff0 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
29000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
29010 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29020 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  up;.      put4by
29030 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
29040 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69  ell(pParent,nxDi
29050 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  v), pNew->pgno);
29060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29070 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29080 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
29090 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
290a0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
290b0 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
290c0 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
290d0 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
290e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
290f0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
29100 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
29110 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
29120 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
29130 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
29140 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
29150 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
29160 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21  >autoVacuum && !
29170 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
29180 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29190 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20  utOvfl(pParent, 
291a0 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20  nxDiv);.        
291b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
291c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
291d0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
291e0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
291f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
29200 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
29210 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
29220 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
29230 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
29240 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
29250 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
29260 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
29270 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
29280 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ){.    memcpy(&a
29290 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
292a0 61 74 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b  ata[8], &apCopy[
292b0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
292c0 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ], 4);.  }.  if(
292d0 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d   nxDiv==pParent-
292e0 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e  >nCell+pParent->
292f0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
29300 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
29310 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69  ibling is the ri
29320 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ght-most child o
29330 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20  f pParent */.   
29340 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
29350 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
29360 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
29370 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
29380 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29390 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
293a0 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66  bling is the lef
293b0 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66  t child of the f
293c0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50  irst entry in pP
293d0 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73  arent.    ** pas
293e0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
293f0 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a   divider entry *
29400 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  /.    put4byte(f
29410 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
29420 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c  pParent, nxDiv),
29430 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
29440 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
29450 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64  * Reparent child
29460 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ren of all cells
29470 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
29480 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
29490 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
294a0 74 43 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65  tChildPages(apNe
294b0 77 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  w[i]);.    if( r
294c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
294d0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
294e0 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nup;.  }.  rc = 
294f0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
29500 65 73 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  es(pParent);.  i
29510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29520 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
29530 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20  cleanup;..  /*. 
29540 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20   ** Balance the 
29550 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f  parent page.  No
29560 74 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72  te that the curr
29570 65 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29  ent page (pPage)
29580 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65   might.  ** have
29590 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74   been added to t
295a0 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69  he freelist so i
295b0 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65  t might no longe
295c0 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  r be initialized
295d0 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70  ..  ** But the p
295e0 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20  arent page will 
295f0 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61  always be initia
29600 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  lized..  */.  as
29610 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
29620 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20  sInit );.  rc = 
29630 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
29640 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a   0);.  .  /*.  *
29650 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
29660 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
29670 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
29680 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61  :.  sqliteFree(a
29690 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
296a0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
296b0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
296c0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
296d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
296e0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
296f0 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
29700 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
29710 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
29720 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
29730 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  E: finished with
29740 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d   %d: old=%d new=
29750 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
29760 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
29770 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65  >pgno, nOld, nNe
29780 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65  w, nCell));.  re
29790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
297a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
297b0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
297c0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
297d0 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72  btree when the r
297e0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  oot.** page cont
297f0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20  ains no cells.  
29800 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72  This is an oppor
29810 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74  tunity to make t
29820 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c  he tree.** shall
29830 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65  ower by one leve
29840 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
29850 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
29860 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
29870 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
29880 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
29890 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
298a0 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
298b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
298c0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
298d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
298e0 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
298f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
29900 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
29910 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29920 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
29930 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
29940 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
29950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
29960 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
29970 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
29980 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
29990 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
299a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
299b0 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
299c0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
299d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
299e0 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
299f0 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
29a00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 73 7a 43  ed */.  int *szC
29a10 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
29a20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
29a30 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
29a40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
29a50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
29a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29a70 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
29a80 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
29a90 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50  Bt;.  mxCellPerP
29aa0 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42  age = MX_CELL(pB
29ab0 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73  t);.  apCell = s
29ac0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
29ad0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73  mxCellPerPage*(s
29ae0 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f  izeof(u8*)+sizeo
29af0 66 28 69 6e 74 29 29 20 29 3b 0a 20 20 69 66 28  f(int)) );.  if(
29b00 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74   apCell==0 ) ret
29b10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
29b20 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 69 6e  ;.  szCell = (in
29b30 74 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c  t*)&apCell[mxCel
29b40 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28  lPerPage];.  if(
29b50 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
29b60 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
29b70 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
29b80 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43  mpty */.    TRAC
29b90 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70  E(("BALANCE: emp
29ba0 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20  ty table %d\n", 
29bb0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
29bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
29bd0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
29be0 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e  empty but has on
29bf0 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66  e child.  Transf
29c00 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e  er the.    ** in
29c10 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
29c20 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e  hat one child in
29c30 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
29c40 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77   if it .    ** w
29c50 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72  ill fit.  This r
29c60 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68  educes the depth
29c70 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20   of the tree by 
29c80 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
29c90 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
29ca0 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69  age is page 1, i
29cb0 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65  t has less space
29cc0 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a   available than.
29cd0 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64      ** its child
29ce0 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30   (due to the 100
29cf0 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61   byte header tha
29d00 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
29d10 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
29d20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
29d30 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67   fle), so it mig
29d40 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ht not be able t
29d50 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68  o hold all of th
29d60 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  e .    ** inform
29d70 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ation currently 
29d80 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
29d90 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73   child.  If this
29da0 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   is the .    ** 
29db0 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  case, then do no
29dc0 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65  t do the transfe
29dd0 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31  r.  Leave page 1
29de0 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20   empty except.  
29df0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67    ** for the rig
29e00 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ht-pointer to th
29e10 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  e child page.  T
29e20 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65  he child page be
29e30 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  comes.    ** the
29e40 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66   virtual root of
29e50 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a   the tree..    *
29e60 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  /.    pgnoChild 
29e70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
29e80 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
29e90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
29ea0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
29eb0 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73  hild>0 );.    as
29ec0 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c  sert( pgnoChild<
29ed0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
29ee0 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42  ecount(pPage->pB
29ef0 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
29f00 20 20 72 63 20 3d 20 67 65 74 50 61 67 65 28 70    rc = getPage(p
29f10 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43  Page->pBt, pgnoC
29f20 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30  hild, &pChild, 0
29f30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29f40 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
29f50 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66  _balance;.    if
29f60 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  ( pPage->pgno==1
29f70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
29f80 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
29f90 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
29fa0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
29fb0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
29fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29fd0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
29fe0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
29ff0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
2a000 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
2a010 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
2a020 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
2a030 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2a040 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
2a050 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
2a060 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2a070 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
2a080 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2a090 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2a0a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
2a0b0 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
2a0c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
2a0d0 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
2a0e0 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
2a0f0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
2a100 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
2a110 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
2a120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a130 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2a140 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2a150 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
2a160 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
2a170 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
2a180 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
2a190 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
2a1a0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
2a1b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2a1c0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2a1d0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2a1e0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2a1f0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2a200 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2a210 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2a220 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2a230 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
2a240 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2a250 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
2a260 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
2a270 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2a280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a290 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
2a2a0 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
2a2b0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
2a2c0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
2a2d0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
2a2e0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
2a2f0 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
2a300 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
2a310 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2a320 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
2a330 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
2a340 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2a350 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
2a360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2a370 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
2a380 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
2a390 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
2a3a0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
2a3b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2a3c0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
2a3d0 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20  >pParent = 0;.  
2a3e0 20 20 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67      rc = initPag
2a3f0 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2a400 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2a410 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2a420 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2a430 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2a440 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2a450 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2a460 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2a470 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2a480 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2a490 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2a4a0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
2a4b0 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67 65  ChildPages(pPage
2a4c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a4d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2a4e0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
2a4f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2a500 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2a510 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2a520 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2a530 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
2a540 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
2a550 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  { .        rc = 
2a560 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
2a570 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  age, i);.       
2a580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a5a0 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2a5b0 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
2a5c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a5d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2a5e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a5f0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2a600 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72  w_balance;.    r
2a610 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2a620 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
2a630 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
2a640 71 6c 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c  qliteFree(apCell
2a650 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a660 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
2a670 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
2a680 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
2a690 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
2a6a0 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
2a6b0 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
2a6c0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
2a6d0 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
2a6e0 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
2a6f0 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
2a700 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
2a710 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
2a720 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
2a730 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
2a740 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
2a750 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
2a760 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
2a770 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
2a780 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
2a790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2a7a0 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
2a7b0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
2a7c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a7d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
2a7e0 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
2a7f0 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
2a800 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
2a810 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
2a820 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2a830 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2a840 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
2a850 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2a860 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2a870 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2a880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2a890 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
2a8a0 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
2a8b0 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
2a8c0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
2a8d0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2a8e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2a8f0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2a900 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
2a910 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
2a920 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
2a930 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
2a940 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2a950 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2a960 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2a970 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62  arent */.  int b
2a980 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk;            /
2a990 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2a9a0 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2a9b0 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2a9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a9d0 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20  >pParent==0 );. 
2a9e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a9f0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
2aa00 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2aa10 74 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  t;.  rc = alloca
2aa20 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2aa30 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43   &pChild, &pgnoC
2aa40 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e  hild, pPage->pgn
2aa50 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  o, 0);.  if( rc 
2aa60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61  ) return rc;.  a
2aa70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2aa80 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2aa90 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
2aaa0 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
2aab0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2aac0 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  e;.  data = pPag
2aad0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
2aae0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2aaf0 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32  et;.  brk = get2
2ab00 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2ab10 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
2ab20 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
2ab30 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
2ab40 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
2ab50 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
2ab60 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
2ab70 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
2ab80 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d  brk], &data[brk]
2ab90 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b  , usableSize-brk
2aba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
2abb0 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ild->isInit==0 )
2abc0 3b 0a 20 20 72 63 20 3d 20 69 6e 69 74 50 61 67  ;.  rc = initPag
2abd0 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29  e(pChild, pPage)
2abe0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2abf0 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2ac00 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43  out;.  memcpy(pC
2ac10 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  hild->aOvfl, pPa
2ac20 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ge->aOvfl, pPage
2ac30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65  ->nOverflow*size
2ac40 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2ac50 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e  0]));.  pChild->
2ac60 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2ac70 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2ac80 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  if( pChild->nOve
2ac90 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68  rflow ){.    pCh
2aca0 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  ild->nFree = 0;.
2acb0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2acc0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2acd0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a  ge->nCell );.  z
2ace0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2acf0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
2ad00 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
2ad10 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2ad20 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2ad30 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2ad40 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28  Child);.  TRACE(
2ad50 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
2ad60 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
2ad70 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2ad80 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2ad90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ada0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2adb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2adc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74  acuum ){.    int
2add0 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   i;.    rc = ptr
2ade0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
2adf0 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
2ae00 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
2ae10 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2ae20 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
2ae30 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66  eeper_out;.    f
2ae40 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2ae50 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2ae60 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ae70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20  PutOvfl(pChild, 
2ae80 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  i);.      if( rc
2ae90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2aea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2aeb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2aec0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
2aed0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2aee0 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61  t(pChild);..bala
2aef0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20  ncedeeper_out:. 
2af00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2af10 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ild);.  return r
2af20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69  c;.}../*.** Deci
2af30 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70  de if the page p
2af40 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  Page needs to be
2af50 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62   balanced.  If b
2af60 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72  alancing is.** r
2af70 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68  equired, call th
2af80 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2af90 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e  lancing routine.
2afa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2afb0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a  alance(MemPage *
2afc0 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72  pPage, int inser
2afd0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2afe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2aff0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2b000 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
2b010 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2b020 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2b030 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
2b040 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2b050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b060 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2b070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2b080 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
2b090 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  wer(pPage);.    
2b0a0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
2b0b0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2b0c0 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
2b0d0 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50    (!insert && pP
2b0e0 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
2b0f0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2b100 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
2b110 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
2b120 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20  root(pPage);.   
2b130 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2b140 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2b150 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
2b160 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61   all cursors tha
2b170 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65  t point to table
2b180 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66   pgnoRoot..** If
2b190 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75   any of those cu
2b1a0 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65  rsors were opene
2b1b0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
2b1c0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a   in a different.
2b1d0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2b1e0 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61  ection (a databa
2b1f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  se connection th
2b200 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61  at shares the pa
2b210 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74  ger.** cache wit
2b220 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
2b230 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68  nnection) and th
2b240 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  at other connect
2b250 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69  ion .** is not i
2b260 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  n the ReadUncomm
2b270 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68  mitted state, th
2b280 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b290 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2b2a0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a  TE_LOCKED..**.**
2b2b0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
2b2c0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61  checking for rea
2b2d0 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61  d-locks (where a
2b2e0 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d   read-lock .** m
2b2f0 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70  eans a cursor op
2b300 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
2b310 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0) this routin
2b320 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20  e also moves.** 
2b330 61 6c 6c 20 63 75 72 73 6f 72 73 20 77 72 69 74  all cursors writ
2b340 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68 61  e cursors so tha
2b350 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  t they are point
2b360 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
2b370 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65  irst Cell on the
2b380 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 69   root page.  Thi
2b390 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
2b3a0 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72 74  ecause an insert
2b3b0 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d   .** or delete m
2b3c0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
2b3d0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2b3e0 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65 6c  on a page or del
2b3f0 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e  ete.** a page en
2b400 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64 6f  tirely and we do
2b410 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65 61   not want to lea
2b420 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20 0a  ve any cursors .
2b430 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e  ** pointing to n
2b440 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67 65  on-existant page
2b450 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  s or cells..*/.s
2b460 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
2b470 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  eadLocks(Btree *
2b480 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e  pBtree, Pgno pgn
2b490 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  oRoot, BtCursor 
2b4a0 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42 74  *pExclude){.  Bt
2b4b0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53  Cursor *p;.  BtS
2b4c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74  hared *pBt = pBt
2b4d0 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  ree->pBt;.  sqli
2b4e0 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65  te3 *db = pBtree
2b4f0 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f 72  ->pSqlite;.  for
2b500 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2b510 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2b520 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
2b530 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
2b540 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61  .    if( p->eSta
2b550 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2b560 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b570 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
2b580 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
2b590 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2b5a0 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20  ->wrFlag==0 ){. 
2b5b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2b5c0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
2b5d0 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20 20  e->pSqlite;.    
2b5e0 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30    if( dbOther==0
2b5f0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62   ||.         (db
2b600 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
2b610 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
2b620 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2b630 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  itted)==0) ){.  
2b640 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b650 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
2b660 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2b670 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  ( p->pPage->pgno
2b680 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  !=p->pgnoRoot ){
2b690 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  .      moveToRoo
2b6a0 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
2b6b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b6c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
2b6d0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
2b6e0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
2b6f0 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
2b700 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
2b710 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
2b720 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
2b730 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
2b740 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2b750 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
2b760 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
2b770 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
2b780 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2b790 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2b7a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b7b0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2b7c0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
2b7d0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
2b7e0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
2b7f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
2b800 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
2b810 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
2b820 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
2b830 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
2b840 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
2b850 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
2b860 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b870 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
2b880 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2b890 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2b8a0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
2b8b0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
2b8c0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
2b8d0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
2b8e0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
2b8f0 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
2b900 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
2b910 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
2b920 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
2b930 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
2b940 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
2b950 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b970 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
2b980 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
2b990 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
2b9a0 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20  nt appendBias   
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b9c0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2b9d0 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
2b9e0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
2b9f0 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
2ba00 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
2ba10 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
2ba20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2ba30 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 3b  ur->pBtree->pBt;
2ba40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ba50 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
2ba60 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
2ba70 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
2ba80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2ba90 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2baa0 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2bab0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2bac0 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2bad0 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
2bae0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
2baf0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2bb00 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2bb10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73  _ERROR;.  }.  as
2bb20 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2bb30 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
2bb40 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2bb50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bb60 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
2bb70 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
2bb80 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2bb90 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2bba0 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2bbb0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2bbc0 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2bbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2bbe0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2bbf0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2bc00 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2bc10 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61   */.  }..  /* Sa
2bc20 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2bc30 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2bc40 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
2bc50 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c  is table */.  cl
2bc60 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2bc70 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  n(pCur);.  if( .
2bc80 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2bc90 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2bca0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2bcb0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
2bcc0 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
2bcd0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
2bce0 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2bcf0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
2bd00 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
2bd10 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2bd20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
2bd30 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2bd40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bd50 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
2bd60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2bd70 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
2bd80 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2bd90 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
2bda0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
2bdb0 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
2bdc0 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
2bdd0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2bde0 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
2bdf0 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
2be00 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
2be10 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
2be20 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
2be30 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2be40 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2be50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2be60 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2be70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2be80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2be90 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69 74   newCell = sqlit
2bea0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f 43  eMallocRaw( MX_C
2beb0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2bec0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2bed0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2bee0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2bef0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2bf00 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2bf10 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2bf20 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2bf30 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2bf40 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2bf50 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2bf60 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2bf70 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2bf80 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2bf90 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2bfa0 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2bfb0 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2bfc0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2bfd0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 4f  e ){.    int szO
2bfe0 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2bff0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2c000 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2c010 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f 6c  >nCell );.    ol
2c020 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
2c030 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2c040 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2c050 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c060 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2c070 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2c080 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2c090 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2c0a0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2c0b0 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2c0c0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2c0d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2c0e0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2c0f0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2c100 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73  ge, pCur->idx, s
2c110 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zOld);.  }else i
2c120 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
2c130 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
2c140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c150 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75  >leaf );.    pCu
2c160 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43  r->idx++;.    pC
2c170 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2c180 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2c190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c1a0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2c1b0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2c1c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2c1d0 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2c1e0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2c1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c200 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2c210 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2c220 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2c230 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2c240 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2c250 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2c260 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2c270 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2c280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c290 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2c2a0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2c2b0 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69 74  _insert:.  sqlit
2c2c0 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b 0a  eFree(newCell);.
2c2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c2e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2c2f0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2c300 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2c310 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
2c320 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2c330 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2c340 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  om location..*/.
2c350 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c360 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
2c370 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2c380 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2c390 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e  >pPage;.  unsign
2c3a0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2c3b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f    int rc;.  Pgno
2c3c0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a   pgnoChild = 0;.
2c3d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2c3e0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
2c3f0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2c400 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2c410 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2c420 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2c430 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2c440 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2c450 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2c460 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
2c470 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  */.    return pB
2c480 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2c490 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2c4a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2c4b0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2c4c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2c4d0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d  if( pCur->idx >=
2c4e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b   pPage->nCell ){
2c4f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c500 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68  TE_ERROR;  /* Th
2c510 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2c520 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74  pointing to anyt
2c530 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2c540 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2c550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c560 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2c570 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69  Did not open thi
2c580 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69  s cursor for wri
2c590 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2c5a0 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2c5b0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2c5c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c5d0 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2c5e0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2c5f0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2c600 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2c610 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2c620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2c630 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2c640 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2c650 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2c660 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2c670 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2c680 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2c690 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2c6a0 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2c6b0 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2c6c0 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2c6d0 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2c6e0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2c6f0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2c700 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2c710 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2c720 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2c730 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2c740 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
2c750 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2c760 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
2c770 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
2c780 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2c790 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2c7a0 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
2c7b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c7c0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2c7d0 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
2c7e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c7f0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
2c800 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
2c810 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  's page and leav
2c820 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
2c830 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
2c840 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
2c850 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
2c860 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2c870 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c880 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
2c890 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
2c8a0 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
2c8b0 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20  .  */.  pCell = 
2c8c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c8d0 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66  pCur->idx);.  if
2c8e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2c8f0 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2c900 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2c910 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2c920 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2c930 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2c940 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
2c950 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c960 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
2c970 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61  * The entry we a
2c980 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65  re about to dele
2c990 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
2c9a0 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   so if we do not
2c9b0 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74  .    ** do somet
2c9c0 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61  hing we will lea
2c9d0 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20  ve a hole on an 
2c9e0 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20  internal page.. 
2c9f0 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f     ** We have to
2ca00 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62   fill the hole b
2ca10 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65  y moving in a ce
2ca20 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20  ll from a leaf. 
2ca30 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   The.    ** next
2ca40 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20   Cell after the 
2ca50 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  one to be delete
2ca60 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  d is guaranteed 
2ca70 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20  to exist and.   
2ca80 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66   ** to be a leaf
2ca90 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69   so we can use i
2caa0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74  t..    */.    Bt
2cab0 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a  Cursor leafCur;.
2cac0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2cad0 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e  r *pNext;.    in
2cae0 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54 68  t szNext;  /* Th
2caf0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
2cb00 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a 4e  ng is wrong: szN
2cb10 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a 20  ext is always . 
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb30 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ** initialized b
2cb40 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64 69  efore use.  Addi
2cb50 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69 74  ng an extra init
2cb60 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
2cb80 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63 6f  o silence the co
2cb90 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f 77  mpiler slows dow
2cba0 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  n the code. */. 
2cbb0 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
2cbc0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2cbd0 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
2cbe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2cbf0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b  age->leafData );
2cc00 0a 20 20 20 20 67 65 74 54 65 6d 70 43 75 72 73  .    getTempCurs
2cc10 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2cc20 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2cc30 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2cc40 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2cc50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2cc60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2cc80 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72  gerWrite(leafCur
2cc90 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  .pPage->pDbPage)
2cca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ccb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ccc0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2ccd0 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2cce0 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2ccf0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2cd00 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2cd10 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2cd20 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2cd30 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2cd40 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2cd50 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2cd60 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2cd70 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2cd80 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2cd90 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2cda0 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2cdb0 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2cdc0 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2cdd0 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2cde0 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2cdf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2ce00 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2ce10 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2ce20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73      tempCell = s
2ce30 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2ce40 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2ce50 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ) );.      if( t
2ce60 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2ce70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ce80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2ce90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2cea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ceb0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2cec0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2ced0 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  r->idx, pNext-4,
2cee0 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2cef0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ell, 0);.    }. 
2cf00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cf10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75  E_OK ){.      pu
2cf20 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2cf30 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  lowCell(pPage, p
2cf40 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43  Cur->idx), pgnoC
2cf50 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 72 63 20  hild);.      rc 
2cf60 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2cf70 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
2cf80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cf90 20 29 7b 0a 20 20 20 20 20 20 64 72 6f 70 43 65   ){.      dropCe
2cfa0 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2cfb0 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2cfc0 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 63  zNext);.      rc
2cfd0 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43   = balance(leafC
2cfe0 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ur.pPage, 0);.  
2cff0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
2d000 65 65 28 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20  ee(tempCell);.  
2d010 20 20 72 65 6c 65 61 73 65 54 65 6d 70 43 75 72    releaseTempCur
2d020 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
2d030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
2d040 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2d050 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
2d060 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2d070 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2d080 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
2d090 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
2d0a0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2d0b0 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2d0c0 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2d0d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2d0e0 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
2d0f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d100 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2d110 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2d120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d130 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2d140 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2d150 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2d160 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2d170 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2d180 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2d190 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2d1a0 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2d1b0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2d1c0 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2d1d0 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2d1e0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2d1f0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2d200 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2d210 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2d220 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2d230 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2d240 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2d250 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2d260 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2d270 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2d280 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2d290 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2d2a0 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2d2b0 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2d2c0 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 69 6e 74  L indices.*/.int
2d2d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
2d2e0 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2d2f0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2d300 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2d310 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d320 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2d330 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2d340 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2d350 72 63 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  rc;.  if( pBt->i
2d360 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2d370 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2d380 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2d390 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2d3a0 73 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  st */.    return
2d3b0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2d3c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2d3d0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2d3e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2d3f0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2d400 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
2d410 65 67 61 6c 20 74 6f 20 63 72 65 61 74 65 20 61  egal to create a
2d420 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75   table if any cu
2d430 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f  rsors are open o
2d440 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
2d450 61 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63  ase. This is bec
2d460 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63  ause in auto-vac
2d470 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63  uum mode the bac
2d480 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65  kend may.  ** ne
2d490 65 64 20 74 6f 20 6d 6f 76 65 20 61 20 64 61 74  ed to move a dat
2d4a0 61 62 61 73 65 20 70 61 67 65 20 74 6f 20 6d 61  abase page to ma
2d4b0 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2d4c0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  new root-page.. 
2d4d0 20 2a 2a 20 49 66 20 61 6e 20 6f 70 65 6e 20 63   ** If an open c
2d4e0 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
2d4f0 74 68 65 20 70 61 67 65 20 61 20 70 72 6f 62 6c  the page a probl
2d500 65 6d 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  em would occur..
2d510 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2d520 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
2d530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2d540 4b 45 44 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  KED;.  }..#ifdef
2d550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d560 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
2d570 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2d580 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2d590 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2d5a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d5b0 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69 66  n rc;.#else.  if
2d5c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2d5d0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
2d5e0 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
2d5f0 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
2d600 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2d610 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2d620 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2d630 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
2d640 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
2d650 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  o. */..    /* Re
2d660 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
2d670 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
2d680 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
2d690 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
2d6a0 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
2d6b0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2d6c0 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
2d6d0 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
2d6e0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2d6f0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
2d700 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
2d710 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
2d720 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
2d730 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d740 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2d750 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
2d760 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d770 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2d780 72 63 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74  rc;.    pgnoRoot
2d790 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  ++;..    /* The 
2d7a0 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61  new root-page ma
2d7b0 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  y not be allocat
2d7c0 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d  ed on a pointer-
2d7d0 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65  map page, or the
2d7e0 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f  .    ** PENDING_
2d7f0 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a  BYTE page..    *
2d800 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 52 6f  /.    if( pgnoRo
2d810 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2d820 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2d830 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2d840 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2d850 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2d860 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2d870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2d880 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2d890 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2d8a0 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2d8b0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2d8c0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2d8d0 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2d8e0 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2d8f0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2d900 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2d910 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2d920 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2d930 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2d940 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2d950 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2d960 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2d970 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2d980 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2d990 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d9a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d9b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d9c0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2d9d0 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2d9e0 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2d9f0 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2da00 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2da10 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2da20 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2da30 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2da40 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2da50 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2da60 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2da70 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2da80 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2da90 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2daa0 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2dab0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2dac0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2dad0 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2dae0 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2daf0 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2db00 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2db10 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2db20 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2db30 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2db40 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2db50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2db60 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2db70 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2db80 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2db90 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2dba0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  */.      rc = ge
2dbb0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2dbc0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2dbd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2dbe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dbf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2dc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2dc10 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2dc20 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70   pgnoRoot, &eTyp
2dc30 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
2dc40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2dc50 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d  ITE_OK || eType=
2dc60 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
2dc70 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2dc80 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2dc90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2dca0 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2dcb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2dcc0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2dcd0 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  t( eType!=PTRMAP
2dce0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20  _ROOTPAGE );.   
2dcf0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
2dd00 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  !=PTRMAP_FREEPAG
2dd10 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
2dd20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dd30 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
2dd40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2dd50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dd60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2dd70 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  e(pRoot);.      
2dd80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2dd90 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2dda0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2ddb0 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20  , pRoot, eType, 
2ddc0 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f  iPtrPage, pgnoMo
2ddd0 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ve);.      relea
2dde0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a  sePage(pRoot);..
2ddf0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
2de00 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f  the page at pgno
2de10 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  Root */.      if
2de20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2de30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2de40 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2de50 20 20 20 20 72 63 20 3d 20 67 65 74 50 61 67 65      rc = getPage
2de60 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2de70 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2de80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2de90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2dea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2deb0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2dec0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2ded0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2dee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2def0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2df00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2df10 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2df20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2df30 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2df40 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
2df50 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
2df60 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2df70 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
2df80 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
2df90 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2dfa0 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
2dfb0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2dfc0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
2dfd0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2dfe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2dff0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2e000 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2e010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e020 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2e030 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2e040 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
2e050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2e060 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2e070 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2e080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e090 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
2e0a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2e0b0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2e0c0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2e0d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2e0e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e0f0 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
2e100 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e110 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
2e120 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2e130 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
2e140 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
2e150 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2e160 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
2e170 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
2e180 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
2e190 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
2e1a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2e1b0 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2e1c0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2e1d0 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2e1e0 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2e1f0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2e200 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2e210 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2e220 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2e230 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2e240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2e250 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2e260 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2e270 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2e280 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2e290 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2e2a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2e2b0 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2e2c0 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2e2d0 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2e2e0 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2e2f0 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2e300 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2e310 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2e320 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2e330 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2e340 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2e350 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
2e360 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  pgno>sqlite3Page
2e370 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
2e380 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
2e390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2e3a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2e3b0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2e3c0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
2e3d0 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74   &pPage, pParent
2e3e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2e3f0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2e400 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
2e410 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2e420 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
2e430 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2e440 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
2e450 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2e460 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
2e470 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2e480 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2e490 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  ell), pPage->pPa
2e4a0 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rent, 1);.      
2e4b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2e4c0 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e4d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
2e4e0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2e4f0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2e500 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e510 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e520 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2e530 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e540 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2e550 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2e560 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2e570 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67  >aData[8]), pPag
2e580 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  e->pParent, 1);.
2e590 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2e5a0 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2e5b0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
2e5c0 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20  f( freePageFlag 
2e5d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2e5e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
2e5f0 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
2e600 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e610 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e620 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f  )==0 ){.    zero
2e630 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
2e640 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54  e->aData[0] | PT
2e650 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c  F_LEAF);.  }..cl
2e660 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2e670 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2e680 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
2e690 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e6a0 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f   Delete all info
2e6b0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73  rmation from a s
2e6c0 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
2e6d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54  he database.  iT
2e6e0 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70  able is.** the p
2e6f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2e700 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2e710 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73  ble.  After this
2e720 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2e730 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  ,.** the root pa
2e740 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74  ge is empty, but
2e750 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a   still exists..*
2e760 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e770 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2e780 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2e790 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2e7a0 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72  open.** read cur
2e7b0 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2e7c0 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63  e.  Open write c
2e7d0 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64  ursors are moved
2e7e0 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   to the.** root 
2e7f0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  of the table..*/
2e800 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e810 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
2e820 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
2e830 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
2e840 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e850 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 2d 3e  ->pBt;.  if( p->
2e860 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
2e870 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75  RITE ){.    retu
2e880 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  rn pBt->readOnly
2e890 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2e8a0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2e8b0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 68  R;.  }.  rc = ch
2e8c0 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
2e8d0 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66  iTable, 0);.  if
2e8e0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
2e8f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2e900 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2e910 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  on of all cursor
2e920 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
2e930 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 53 51  able */.  if( SQ
2e940 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2e950 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2e960 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29  t, iTable, 0)) )
2e970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2e980 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 63  .  }..  return c
2e990 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2e9a0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62  (pBt, (Pgno)iTab
2e9b0 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  le, 0, 0);.}../*
2e9c0 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e  .** Erase all in
2e9d0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74  formation in a t
2e9e0 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65  able and add the
2e9f0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
2ea00 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65  le to.** the fre
2ea10 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20  elist.  Except, 
2ea20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2ea30 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20  principle table 
2ea40 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70  (the one on.** p
2ea50 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20  age 1) is never 
2ea60 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2ea70 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elist..**.** Thi
2ea80 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
2ea90 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
2eaa0 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
2eab0 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
2eac0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
2ead0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41  able..**.** If A
2eae0 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61  UTOVACUUM is ena
2eaf0 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  bled and the pag
2eb00 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e  e at iTable is n
2eb10 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72  ot the last.** r
2eb20 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2eb30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2eb40 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f  hen the last roo
2eb50 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68  t page .** in th
2eb60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2eb70 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  is moved into th
2eb80 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  e slot formerly 
2eb90 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69  occupied by.** i
2eba0 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c  Table and that l
2ebb0 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  ast slot formerl
2ebc0 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68  y occupied by th
2ebd0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2ebe0 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
2ebf0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73  the freelist ins
2ec00 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20  tead of iTable. 
2ec10 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c   In this say, al
2ec20 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
2ec30 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20  are kept at the 
2ec40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2ec50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ec60 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65  which.** is nece
2ec70 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41  ssary for AUTOVA
2ec80 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67  CUUM to work rig
2ec90 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73  ht.  *piMoved is
2eca0 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20   set to the .** 
2ecb0 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
2ecc0 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20   used to be the 
2ecd0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69  last root page i
2ece0 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  n the file befor
2ecf0 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20  e.** the move.  
2ed00 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20  If no page gets 
2ed10 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20  moved, *piMoved 
2ed20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20  is set to 0..** 
2ed30 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  The last root pa
2ed40 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ge is recorded i
2ed50 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68  n meta[3] and th
2ed60 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65  e value of.** me
2ed70 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64  ta[3] is updated
2ed80 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
2ed90 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
2eda0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
2edb0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2edc0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
2edd0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2ede0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2edf0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
2ee00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2ee10 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2ee20 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2ee30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74  {.    return pBt
2ee40 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2ee50 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2ee60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2ee70 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
2ee80 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74  egal to drop a t
2ee90 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73  able if any curs
2eea0 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  ors are open on 
2eeb0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
2eec0 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  e. This is becau
2eed0 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
2eee0 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65  m mode the backe
2eef0 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64  nd may.  ** need
2ef00 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72   to move another
2ef10 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69   root-page to fi
2ef20 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79  ll a gap left by
2ef30 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a   the deleted.  *
2ef40 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20  * root page. If 
2ef50 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
2ef60 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61  as using this pa
2ef70 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75  ge a problem wou
2ef80 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a  ld .  ** occur..
2ef90 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2efa0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
2efb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2efc0 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KED;.  }..  rc =
2efd0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 28 50   getPage(pBt, (P
2efe0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61  gno)iTable, &pPa
2eff0 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
2f000 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2f010 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f020 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69  eClearTable(p, i
2f030 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  Table);.  if( rc
2f040 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
2f050 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2f060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2f070 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
2f080 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
2f090 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2f0a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f0b0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2f0c0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2f0d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2f0e0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
2f0f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2f100 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
2f110 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2f120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f130 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2f140 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
2f150 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f170 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f180 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2f190 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f1a0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
2f1b0 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
2f1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2f1d0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
2f1e0 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
2f1f0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
2f200 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2f210 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2f220 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
2f230 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
2f240 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
2f250 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
2f260 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
2f270 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2f280 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2f290 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2f2a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2f2b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f2c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f2d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f2f0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
2f300 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
2f310 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
2f320 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2f330 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2f340 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f350 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
2f360 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
2f370 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
2f380 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
2f390 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
2f3a0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
2f3b0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2f3c0 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
2f3d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f3e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
2f3f0 20 67 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61   getPage(pBt, ma
2f400 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
2f410 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2f420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2f440 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2f450 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2f460 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
2f470 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
2f480 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
2f490 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ble);.        re
2f4a0 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
2f4b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f4c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f4d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f4e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2f4f0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 50 61        rc = getPa
2f500 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
2f510 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
2f520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2f530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f550 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2f560 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2f570 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2f580 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f590 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
2f5a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2f5c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2f5d0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f   }.        *piMo
2f5e0 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e  ved = maxRootPgn
2f5f0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
2f600 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77    /* Set the new
2f610 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27   'max-root-page'
2f620 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61   value in the da
2f630 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54  tabase header. T
2f640 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  his.      ** is 
2f650 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65  the old value le
2f660 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65  ss one, less one
2f670 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61   more if that ha
2f680 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a  ppens to.      *
2f690 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  * be a root-page
2f6a0 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e   number, less on
2f6b0 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20  e again if that 
2f6c0 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
2f6d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2f6e0 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  E..      */.    
2f6f0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2f700 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2f710 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  otPgno==PENDING_
2f720 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2f730 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f  {.        maxRoo
2f740 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d  tPgno--;.      }
2f750 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f  .      if( maxRo
2f760 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50  otPgno==PTRMAP_P
2f770 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f  AGENO(pBt, maxRo
2f780 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  otPgno) ){.     
2f790 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
2f7a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f7b0 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50  assert( maxRootP
2f7c0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2f7d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2f7e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f7f0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2f800 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50  a(p, 4, maxRootP
2f810 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gno);.    }else{
2f820 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2f830 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f840 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f850 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
2f860 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
2f870 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74   /* If sqlite3Bt
2f880 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73  reeDropTable was
2f890 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
2f8a0 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61  1. */.    zeroPa
2f8b0 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e  ge(pPage, PTF_IN
2f8c0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b  TKEY|PTF_LEAF );
2f8d0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2f8e0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
2f8f0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 0a  eturn rc;  .}...
2f900 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d  /*.** Read the m
2f910 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
2f920 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  out of a databas
2f930 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d  e file.  Meta[0]
2f940 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65  .** is the numbe
2f950 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  r of free pages 
2f960 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
2f970 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61   database.  Meta
2f980 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d  [1].** through m
2f990 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69  eta[15] are avai
2f9a0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79  lable for use by
2f9b0 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20   higher layers. 
2f9c0 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72   Meta[0].** is r
2f9d0 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74  ead-only, the ot
2f9e0 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77 72  hers are read/wr
2f9f0 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ite..** .** The 
2fa00 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d  schema layer num
2fa10 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73  bers meta values
2fa20 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41   differently.  A
2fa30 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20  t the schema.** 
2fa40 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20 53  layer (and the S
2fa50 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61  etCookie and Rea
2fa60 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29  dCookie opcodes)
2fa70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
2fa80 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73 20  * free pages is 
2fa90 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f  not visible.  So
2faa0 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68   Cookie[0] is th
2fab0 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31  e same as Meta[1
2fac0 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ]..*/.int sqlite
2fad0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42 74  3BtreeGetMeta(Bt
2fae0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
2faf0 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20   u32 *pMeta){.  
2fb00 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
2fb10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
2fb20 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b  igned char *pP1;
2fb30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2fb40 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a   = p->pBt;..  /*
2fb50 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
2fb60 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
2fb70 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
2fb80 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
2fb90 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
2fba0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2fbb0 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
2fbc0 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
2fbd0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
2fbe0 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
2fbf0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2fc00 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
2fc10 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2fc20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
2fc30 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
2fc40 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
2fc50 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
2fc60 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
2fc70 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
2fc80 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
2fc90 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
2fca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fcb0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
2fcc0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
2fcd0 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2fce0 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20  x<=15 );.  rc = 
2fcf0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2fd00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
2fd10 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
2fd20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2fd30 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e  .  pP1 = (unsign
2fd40 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
2fd50 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2fd60 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61  bPage);.  *pMeta
2fd70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
2fd80 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20  [36 + idx*4]);. 
2fd90 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2fda0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ef(pDbPage);..  
2fdb0 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
2fdc0 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
2fdd0 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
2fde0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
2fdf0 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
2fe00 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
2fe10 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
2fe20 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
2fe30 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
2fe40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2fe50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fe60 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
2fe70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
2fe80 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
2fe90 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
2fea0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
2feb0 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
2fec0 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
2fed0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 72   READ_LOCK);.  r
2fee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fef0 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e  ** Write meta-in
2ff00 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69  formation back i
2ff10 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2ff20 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a  .  Meta[0] is.**
2ff30 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d   read-only and m
2ff40 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ay not be writte
2ff50 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2ff60 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2ff70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
2ff80 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a  dx, u32 iMeta){.
2ff90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2ffa0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2ffb0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a  gned char *pP1;.
2ffc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
2ffd0 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64  rt( idx>=1 && id
2ffe0 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20 70  x<=15 );.  if( p
2fff0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
30000 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
30010 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e  turn pBt->readOn
30020 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
30030 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
30040 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ROR;.  }.  asser
30050 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  t( pBt->pPage1!=
30060 30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74  0 );.  pP1 = pBt
30070 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
30080 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
30090 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
300a0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
300b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
300c0 72 6e 20 72 63 3b 0a 20 20 70 75 74 34 62 79 74  rn rc;.  put4byt
300d0 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
300e0 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 20 20 72 65  4], iMeta);.  re
300f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30100 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
30110 74 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74  the flag byte at
30120 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
30130 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
30140 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  the cursor.** is
30150 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
30160 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  ing to..*/.int s
30170 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
30180 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
30190 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
301a0 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52  t about CURSOR_R
301b0 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
301c0 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20  ? Probably need 
301d0 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73  to call.  ** res
301e0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
301f0 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65  rPosition() here
30200 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ..  */.  MemPage
30210 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
30220 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  pPage;.  return 
30230 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61  pPage ? pPage->a
30240 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
30250 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 23  ffset] : 0;.}..#
30260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
30270 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
30280 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66 20   disassembly of 
30290 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 6f  the given page o
302a0 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
302b0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
302c0 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
302d0 64 65 62 75 67 67 69 6e 67 20 61 6e 64 20 74 65  debugging and te
302e0 73 74 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  sting only..*/.s
302f0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
30300 61 67 65 44 75 6d 70 28 42 74 53 68 61 72 65 64  ageDump(BtShared
30310 20 2a 70 42 74 2c 20 69 6e 74 20 70 67 6e 6f 2c   *pBt, int pgno,
30320 20 69 6e 74 20 72 65 63 75 72 73 69 76 65 2c 20   int recursive, 
30330 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
30340 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
30350 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
30360 20 69 6e 74 20 69 2c 20 6a 2c 20 63 3b 0a 20 20   int i, j, c;.  
30370 69 6e 74 20 6e 46 72 65 65 3b 0a 20 20 75 31 36  int nFree;.  u16
30380 20 69 64 78 3b 0a 20 20 69 6e 74 20 68 64 72 3b   idx;.  int hdr;
30390 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
303a0 69 6e 74 20 69 73 49 6e 69 74 3b 0a 20 20 75 6e  int isInit;.  un
303b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
303c0 61 3b 0a 20 20 63 68 61 72 20 72 61 6e 67 65 5b  a;.  char range[
303d0 32 30 5d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  20];.  unsigned 
303e0 63 68 61 72 20 70 61 79 6c 6f 61 64 5b 32 30 5d  char payload[20]
303f0 3b 0a 0a 20 20 72 63 20 3d 20 67 65 74 50 61 67  ;..  rc = getPag
30400 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 70 67 6e  e(pBt, (Pgno)pgn
30410 6f 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, &pPage, 0);. 
30420 20 69 73 49 6e 69 74 20 3d 20 70 50 61 67 65 2d   isInit = pPage-
30430 3e 69 73 49 6e 69 74 3b 0a 20 20 69 66 28 20 70  >isInit;.  if( p
30440 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Page->isInit==0 
30450 29 7b 0a 20 20 20 20 69 6e 69 74 50 61 67 65 28  ){.    initPage(
30460 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
30470 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
30480 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30490 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
304a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
304b0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
304c0 61 74 61 3b 0a 20 20 63 20 3d 20 64 61 74 61 5b  ata;.  c = data[
304d0 68 64 72 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 69  hdr];.  pPage->i
304e0 6e 74 4b 65 79 20 3d 20 28 63 20 26 20 28 50 54  ntKey = (c & (PT
304f0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
30500 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70 50  FDATA))!=0;.  pP
30510 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20  age->zeroData = 
30520 28 63 20 26 20 50 54 46 5f 5a 45 52 4f 44 41 54  (c & PTF_ZERODAT
30530 41 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e  A)!=0;.  pPage->
30540 6c 65 61 66 44 61 74 61 20 3d 20 28 63 20 26 20  leafData = (c & 
30550 50 54 46 5f 4c 45 41 46 44 41 54 41 29 21 3d 30  PTF_LEAFDATA)!=0
30560 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
30570 3d 20 28 63 20 26 20 50 54 46 5f 4c 45 41 46 29  = (c & PTF_LEAF)
30580 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 68 61  !=0;.  pPage->ha
30590 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65 2d  sData = !(pPage-
305a0 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21 70  >zeroData || (!p
305b0 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70 50  Page->leaf && pP
305c0 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29 3b  age->leafData));
305d0 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  .  nCell = get2b
305e0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
305f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
30600 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 64  gPrintf("PAGE %d
30610 3a 20 20 66 6c 61 67 73 3d 30 78 25 30 32 78 20  :  flags=0x%02x 
30620 20 66 72 61 67 3d 25 64 20 20 20 70 61 72 65 6e   frag=%d   paren
30630 74 3d 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a 20  t=%d\n", pgno,. 
30640 20 20 20 64 61 74 61 5b 68 64 72 5d 2c 20 64 61     data[hdr], da
30650 74 61 5b 68 64 72 2b 37 5d 2c 20 0a 20 20 20 20  ta[hdr+7], .    
30660 28 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 26  (pPage->isInit &
30670 26 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  & pPage->pParent
30680 29 20 3f 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ) ? pPage->pPare
30690 6e 74 2d 3e 70 67 6e 6f 20 3a 20 30 29 3b 0a 20  nt->pgno : 0);. 
306a0 20 61 73 73 65 72 74 28 20 68 64 72 20 3d 3d 20   assert( hdr == 
306b0 28 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  (pgno==1 ? 100 :
306c0 20 30 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 68   0) );.  idx = h
306d0 64 72 20 2b 20 31 32 20 2d 20 70 50 61 67 65 2d  dr + 12 - pPage-
306e0 3e 6c 65 61 66 2a 34 3b 0a 20 20 66 6f 72 28 69  >leaf*4;.  for(i
306f0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
30700 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
30710 69 6e 66 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 63  info;.    Pgno c
30720 68 69 6c 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  hild;.    unsign
30730 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
30740 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
30750 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 61  int addr;..    a
30760 64 64 72 20 3d 20 67 65 74 32 62 79 74 65 28 26  ddr = get2byte(&
30770 64 61 74 61 5b 69 64 78 20 2b 20 32 2a 69 5d 29  data[idx + 2*i])
30780 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 64  ;.    pCell = &d
30790 61 74 61 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70  ata[addr];.    p
307a0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
307b0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
307c0 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
307d0 6e 53 69 7a 65 3b 0a 20 20 20 20 73 70 72 69 6e  nSize;.    sprin
307e0 74 66 28 72 61 6e 67 65 2c 22 25 64 2e 2e 25 64  tf(range,"%d..%d
307f0 22 2c 20 61 64 64 72 2c 20 61 64 64 72 2b 73 7a  ", addr, addr+sz
30800 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  -1);.    if( pPa
30810 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30820 20 20 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20    child = 0;.   
30830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
30840 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70  ild = get4byte(p
30850 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cell);.    }.   
30860 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61   sz = info.nData
30870 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
30880 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d  ->intKey ) sz +=
30890 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20   info.nKey;.    
308a0 69 66 28 20 73 7a 3e 73 69 7a 65 6f 66 28 70 61  if( sz>sizeof(pa
308b0 79 6c 6f 61 64 29 2d 31 20 29 20 73 7a 20 3d 20  yload)-1 ) sz = 
308c0 73 69 7a 65 6f 66 28 70 61 79 6c 6f 61 64 29 2d  sizeof(payload)-
308d0 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 61  1;.    memcpy(pa
308e0 79 6c 6f 61 64 2c 20 26 70 43 65 6c 6c 5b 69 6e  yload, &pCell[in
308f0 66 6f 2e 6e 48 65 61 64 65 72 5d 2c 20 73 7a 29  fo.nHeader], sz)
30900 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
30910 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  <sz; j++){.     
30920 20 69 66 28 20 70 61 79 6c 6f 61 64 5b 6a 5d 3c   if( payload[j]<
30930 30 78 32 30 20 7c 7c 20 70 61 79 6c 6f 61 64 5b  0x20 || payload[
30940 6a 5d 3e 30 78 37 66 20 29 20 70 61 79 6c 6f 61  j]>0x7f ) payloa
30950 64 5b 6a 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20  d[j] = '.';.    
30960 7d 0a 20 20 20 20 70 61 79 6c 6f 61 64 5b 73 7a  }.    payload[sz
30970 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
30980 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
30990 20 20 20 20 20 22 63 65 6c 6c 20 25 32 64 3a 20       "cell %2d: 
309a0 69 3d 25 2d 31 30 73 20 63 68 6c 64 3d 25 2d 34  i=%-10s chld=%-4
309b0 64 20 6e 6b 3d 25 2d 34 6c 6c 64 20 6e 64 3d 25  d nk=%-4lld nd=%
309c0 2d 34 64 20 70 61 79 6c 6f 61 64 3d 25 73 5c 6e  -4d payload=%s\n
309d0 22 2c 0a 20 20 20 20 20 20 69 2c 20 72 61 6e 67  ",.      i, rang
309e0 65 2c 20 63 68 69 6c 64 2c 20 69 6e 66 6f 2e 6e  e, child, info.n
309f0 4b 65 79 2c 20 69 6e 66 6f 2e 6e 44 61 74 61 2c  Key, info.nData,
30a00 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 29 3b 0a   payload.    );.
30a10 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
30a20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 73 71  ->leaf ){.    sq
30a30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
30a40 28 22 72 69 67 68 74 5f 63 68 69 6c 64 3a 20 25  ("right_child: %
30a50 64 5c 6e 22 2c 20 67 65 74 34 62 79 74 65 28 26  d\n", get4byte(&
30a60 64 61 74 61 5b 68 64 72 2b 38 5d 29 29 3b 0a 20  data[hdr+8]));. 
30a70 20 7d 0a 20 20 6e 46 72 65 65 20 3d 20 30 3b 0a   }.  nFree = 0;.
30a80 20 20 69 20 3d 20 30 3b 0a 20 20 69 64 78 20 3d    i = 0;.  idx =
30a90 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
30aa0 68 64 72 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65  hdr+1]);.  while
30ab0 28 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70  ( idx>0 && idx<p
30ac0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
30ad0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  eSize ){.    int
30ae0 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
30af0 64 61 74 61 5b 69 64 78 2b 32 5d 29 3b 0a 20 20  data[idx+2]);.  
30b00 20 20 73 70 72 69 6e 74 66 28 72 61 6e 67 65 2c    sprintf(range,
30b10 22 25 64 2e 2e 25 64 22 2c 20 69 64 78 2c 20 69  "%d..%d", idx, i
30b20 64 78 2b 73 7a 2d 31 29 3b 0a 20 20 20 20 6e 46  dx+sz-1);.    nF
30b30 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 73  ree += sz;.    s
30b40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30b50 66 28 22 66 72 65 65 62 6c 6f 63 6b 20 25 32 64  f("freeblock %2d
30b60 3a 20 69 3d 25 2d 31 30 73 20 73 69 7a 65 3d 25  : i=%-10s size=%
30b70 2d 34 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -4d total=%d\n",
30b80 0a 20 20 20 20 20 20 20 69 2c 20 72 61 6e 67 65  .       i, range
30b90 2c 20 73 7a 2c 20 6e 46 72 65 65 29 3b 0a 20 20  , sz, nFree);.  
30ba0 20 20 69 64 78 20 3d 20 67 65 74 32 62 79 74 65    idx = get2byte
30bb0 28 26 64 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20  (&data[idx]);.  
30bc0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    i++;.  }.  if(
30bd0 20 69 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 73   idx!=0 ){.    s
30be0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
30bf0 66 28 22 45 52 52 4f 52 3a 20 6e 65 78 74 20 66  f("ERROR: next f
30c00 72 65 65 62 6c 6f 63 6b 20 69 6e 64 65 78 20 6f  reeblock index o
30c10 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 64 5c  ut of range: %d\
30c20 6e 22 2c 20 69 64 78 29 3b 0a 20 20 7d 0a 20 20  n", idx);.  }.  
30c30 69 66 28 20 72 65 63 75 72 73 69 76 65 20 26 26  if( recursive &&
30c40 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
30c50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30c60 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
30c70 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
30c80 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
30c90 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
30ca0 20 20 20 20 62 74 72 65 65 50 61 67 65 44 75 6d      btreePageDum
30cb0 70 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  p(pBt, get4byte(
30cc0 70 43 65 6c 6c 29 2c 20 31 2c 20 70 50 61 67 65  pCell), 1, pPage
30cd0 29 3b 0a 20 20 20 20 20 20 69 64 78 20 3d 20 67  );.      idx = g
30ce0 65 74 32 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et2byte(pCell);.
30cf0 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 50      }.    btreeP
30d00 61 67 65 44 75 6d 70 28 70 42 74 2c 20 67 65 74  ageDump(pBt, get
30d10 34 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  4byte(&data[hdr+
30d20 38 5d 29 2c 20 31 2c 20 70 50 61 67 65 29 3b 0a  8]), 1, pPage);.
30d30 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49    }.  pPage->isI
30d40 6e 69 74 20 3d 20 69 73 49 6e 69 74 3b 0a 20 20  nit = isInit;.  
30d50 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
30d60 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
30d70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
30d80 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ut);.  return SQ
30d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
30da0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
30db0 75 6d 70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ump(Btree *p, in
30dc0 74 20 70 67 6e 6f 2c 20 69 6e 74 20 72 65 63 75  t pgno, int recu
30dd0 72 73 69 76 65 29 7b 0a 20 20 72 65 74 75 72 6e  rsive){.  return
30de0 20 62 74 72 65 65 50 61 67 65 44 75 6d 70 28 70   btreePageDump(p
30df0 2d 3e 70 42 74 2c 20 70 67 6e 6f 2c 20 72 65 63  ->pBt, pgno, rec
30e00 75 72 73 69 76 65 2c 20 30 29 3b 0a 7d 0a 23 65  ursive, 0);.}.#e
30e10 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
30e20 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
30e30 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
30e40 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 46 69  _DEBUG)./*.** Fi
30e50 6c 6c 20 61 52 65 73 75 6c 74 5b 5d 20 77 69 74  ll aResult[] wit
30e60 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  h information ab
30e70 6f 75 74 20 74 68 65 20 65 6e 74 72 79 20 61 6e  out the entry an
30e80 64 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  d page that the.
30e90 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ** cursor is poi
30ea0 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a  nting to..** .**
30eb0 20 20 20 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20     aResult[0] = 
30ec0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
30ed0 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 5d  .**   aResult[1]
30ee0 20 3d 20 20 54 68 65 20 65 6e 74 72 79 20 6e 75   =  The entry nu
30ef0 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c  mber.**   aResul
30f00 74 5b 32 5d 20 3d 20 20 54 6f 74 61 6c 20 6e 75  t[2] =  Total nu
30f10 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
30f20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
30f30 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 20    aResult[3] =  
30f40 43 65 6c 6c 20 73 69 7a 65 20 28 6c 6f 63 61 6c  Cell size (local
30f50 20 70 61 79 6c 6f 61 64 20 2b 20 68 65 61 64 65   payload + heade
30f60 72 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  r).**   aResult[
30f70 34 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20  4] =  Number of 
30f80 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68  free bytes on th
30f90 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65  is page.**   aRe
30fa0 73 75 6c 74 5b 35 5d 20 3d 20 20 4e 75 6d 62 65  sult[5] =  Numbe
30fb0 72 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73  r of free blocks
30fc0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
30fd0 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 20    aResult[6] =  
30fe0 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
30ff0 7a 65 20 28 6c 6f 63 61 6c 20 2b 20 6f 76 65 72  ze (local + over
31000 66 6c 6f 77 29 0a 2a 2a 20 20 20 61 52 65 73 75  flow).**   aResu
31010 6c 74 5b 37 5d 20 3d 20 20 48 65 61 64 65 72 20  lt[7] =  Header 
31020 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 2a 2a  size in bytes.**
31030 20 20 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20     aResult[8] = 
31040 20 4c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 73   Local payload s
31050 69 7a 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  ize.**   aResult
31060 5b 39 5d 20 3d 20 20 50 61 72 65 6e 74 20 70 61  [9] =  Parent pa
31070 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ge number.**   a
31080 52 65 73 75 6c 74 5b 31 30 5d 3d 20 20 50 61 67  Result[10]=  Pag
31090 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
310a0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
310b0 61 67 65 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  age.**.** This r
310c0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
310d0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
310e0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
310f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
31100 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 42 74 43  eeCursorInfo(BtC
31110 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
31120 20 2a 61 52 65 73 75 6c 74 2c 20 69 6e 74 20 75   *aResult, int u
31130 70 43 6e 74 29 7b 0a 20 20 69 6e 74 20 63 6e 74  pCnt){.  int cnt
31140 2c 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  , idx;.  MemPage
31150 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
31160 70 50 61 67 65 3b 0a 20 20 42 74 43 75 72 73 6f  pPage;.  BtCurso
31170 72 20 74 6d 70 43 75 72 3b 0a 0a 20 20 69 6e 74  r tmpCur;..  int
31180 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
31190 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
311a0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
311b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
311c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
311d0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
311e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
311f0 20 20 67 65 74 54 65 6d 70 43 75 72 73 6f 72 28    getTempCursor(
31200 70 43 75 72 2c 20 26 74 6d 70 43 75 72 29 3b 0a  pCur, &tmpCur);.
31210 20 20 77 68 69 6c 65 28 20 75 70 43 6e 74 2d 2d    while( upCnt--
31220 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 50 61   ){.    moveToPa
31230 72 65 6e 74 28 26 74 6d 70 43 75 72 29 3b 0a 20  rent(&tmpCur);. 
31240 20 7d 0a 20 20 70 50 61 67 65 20 3d 20 74 6d 70   }.  pPage = tmp
31250 43 75 72 2e 70 50 61 67 65 3b 0a 20 20 61 52 65  Cur.pPage;.  aRe
31260 73 75 6c 74 5b 30 5d 20 3d 20 73 71 6c 69 74 65  sult[0] = sqlite
31270 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
31280 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31290 3b 0a 20 20 61 73 73 65 72 74 28 20 61 52 65 73  ;.  assert( aRes
312a0 75 6c 74 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 70  ult[0]==pPage->p
312b0 67 6e 6f 20 29 3b 0a 20 20 61 52 65 73 75 6c 74  gno );.  aResult
312c0 5b 31 5d 20 3d 20 74 6d 70 43 75 72 2e 69 64 78  [1] = tmpCur.idx
312d0 3b 0a 20 20 61 52 65 73 75 6c 74 5b 32 5d 20 3d  ;.  aResult[2] =
312e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
312f0 20 69 66 28 20 74 6d 70 43 75 72 2e 69 64 78 3e   if( tmpCur.idx>
31300 3d 30 20 26 26 20 74 6d 70 43 75 72 2e 69 64 78  =0 && tmpCur.idx
31310 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  <pPage->nCell ){
31320 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
31330 28 26 74 6d 70 43 75 72 29 3b 0a 20 20 20 20 61  (&tmpCur);.    a
31340 52 65 73 75 6c 74 5b 33 5d 20 3d 20 74 6d 70 43  Result[3] = tmpC
31350 75 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20  ur.info.nSize;. 
31360 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20     aResult[6] = 
31370 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 6e 44 61 74  tmpCur.info.nDat
31380 61 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 37  a;.    aResult[7
31390 5d 20 3d 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e  ] = tmpCur.info.
313a0 6e 48 65 61 64 65 72 3b 0a 20 20 20 20 61 52 65  nHeader;.    aRe
313b0 73 75 6c 74 5b 38 5d 20 3d 20 74 6d 70 43 75 72  sult[8] = tmpCur
313c0 2e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  .info.nLocal;.  
313d0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52 65 73 75  }else{.    aResu
313e0 6c 74 5b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 61  lt[3] = 0;.    a
313f0 52 65 73 75 6c 74 5b 36 5d 20 3d 20 30 3b 0a 20  Result[6] = 0;. 
31400 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
31410 30 3b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 38  0;.    aResult[8
31420 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 52 65  ] = 0;.  }.  aRe
31430 73 75 6c 74 5b 34 5d 20 3d 20 70 50 61 67 65 2d  sult[4] = pPage-
31440 3e 6e 46 72 65 65 3b 0a 20 20 63 6e 74 20 3d 20  >nFree;.  cnt = 
31450 30 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 32 62  0;.  idx = get2b
31460 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
31470 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
31480 65 74 2b 31 5d 29 3b 0a 20 20 77 68 69 6c 65 28  et+1]);.  while(
31490 20 69 64 78 3e 30 20 26 26 20 69 64 78 3c 70 50   idx>0 && idx<pP
314a0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
314b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 6e 74 2b  Size ){.    cnt+
314c0 2b 3b 0a 20 20 20 20 69 64 78 20 3d 20 67 65 74  +;.    idx = get
314d0 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
314e0 61 74 61 5b 69 64 78 5d 29 3b 0a 20 20 7d 0a 20  ata[idx]);.  }. 
314f0 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 63 6e   aResult[5] = cn
31500 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  t;.  if( pPage->
31510 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 69 73  pParent==0 || is
31520 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
31530 29 7b 0a 20 20 20 20 61 52 65 73 75 6c 74 5b 39  ){.    aResult[9
31540 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
31550 20 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20 3d      aResult[9] =
31560 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d   pPage->pParent-
31570 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28  >pgno;.  }.  if(
31580 20 74 6d 70 43 75 72 2e 69 6e 66 6f 2e 69 4f 76   tmpCur.info.iOv
31590 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 61 52  erflow ){.    aR
315a0 65 73 75 6c 74 5b 31 30 5d 20 3d 20 67 65 74 34  esult[10] = get4
315b0 62 79 74 65 28 26 74 6d 70 43 75 72 2e 69 6e 66  byte(&tmpCur.inf
315c0 6f 2e 70 43 65 6c 6c 5b 74 6d 70 43 75 72 2e 69  o.pCell[tmpCur.i
315d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
315e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 52  .  }else{.    aR
315f0 65 73 75 6c 74 5b 31 30 5d 20 3d 20 30 3b 0a 20  esult[10] = 0;. 
31600 20 7d 0a 20 20 72 65 6c 65 61 73 65 54 65 6d 70   }.  releaseTemp
31610 43 75 72 73 6f 72 28 26 74 6d 70 43 75 72 29 3b  Cursor(&tmpCur);
31620 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
31630 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
31640 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
31650 70 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  pager associated
31660 20 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20   with a BTree.  
31670 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
31680 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
31690 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
316a0 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72  g only..*/.Pager
316b0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
316c0 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ger(Btree *p){. 
316d0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
316e0 70 50 61 67 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPager;.}../*.**
316f0 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20   This structure 
31700 69 73 20 70 61 73 73 65 64 20 61 72 6f 75 6e 64  is passed around
31710 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
31720 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
31730 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 69 6e 20   routines.** in 
31740 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 72  order to keep tr
31750 61 63 6b 20 6f 66 20 73 6f 6d 65 20 67 6c 6f 62  ack of some glob
31760 61 6c 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61  al state informa
31770 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
31780 20 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74   struct Integrit
31790 79 43 6b 20 49 6e 74 65 67 72 69 74 79 43 6b 3b  yCk IntegrityCk;
317a0 0a 73 74 72 75 63 74 20 49 6e 74 65 67 72 69 74  .struct Integrit
317b0 79 43 6b 20 7b 0a 20 20 42 74 53 68 61 72 65 64  yCk {.  BtShared
317c0 20 2a 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65   *pBt;    /* The
317d0 20 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63   tree being chec
317e0 6b 65 64 20 6f 75 74 20 2a 2f 0a 20 20 50 61 67  ked out */.  Pag
317f0 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 2f  er *pPager;    /
31800 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74 65 64  * The associated
31810 20 70 61 67 65 72 2e 20 20 41 6c 73 6f 20 61 63   pager.  Also ac
31820 63 65 73 73 69 62 6c 65 20 62 79 20 70 42 74 2d  cessible by pBt-
31830 3e 70 50 61 67 65 72 20 2a 2f 0a 20 20 69 6e 74  >pPager */.  int
31840 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f   nPage;        /
31850 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
31860 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
31870 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 6e 52 65  e */.  int *anRe
31880 66 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  f;       /* Numb
31890 65 72 20 6f 66 20 74 69 6d 65 73 20 65 61 63 68  er of times each
318a0 20 70 61 67 65 20 69 73 20 72 65 66 65 72 65 6e   page is referen
318b0 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45  ced */.  int mxE
318c0 72 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74  rr;        /* St
318d0 6f 70 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  op accumulating 
318e0 65 72 72 6f 72 73 20 77 68 65 6e 20 74 68 69 73  errors when this
318f0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 2a 2f   reaches zero */
31900 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
31910 3b 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72  ;    /* An error
31920 20 6d 65 73 73 61 67 65 2e 20 20 4e 55 4c 4c 20   message.  NULL 
31930 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 73 65 65  if no errors see
31940 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  n. */.  int nErr
31950 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
31960 62 65 72 20 6f 66 20 6d 65 73 73 61 67 65 73 20  ber of messages 
31970 77 72 69 74 74 65 6e 20 74 6f 20 7a 45 72 72 4d  written to zErrM
31980 73 67 20 73 6f 20 66 61 72 20 2a 2f 0a 7d 3b 0a  sg so far */.};.
31990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
319a0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
319b0 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
319c0 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
319d0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
319e0 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
319f0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
31a00 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
31a10 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
31a20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
31a30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
31a40 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
31a50 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
31a60 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28  ar *zMsg2;.  if(
31a70 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
31a80 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
31a90 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
31aa0 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
31ab0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
31ac0 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20  ormat);.  zMsg2 
31ad0 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
31ae0 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
31af0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
31b00 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a  if( zMsg1==0 ) z
31b10 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28  Msg1 = "";.  if(
31b20 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
31b30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
31b40 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72  ld = pCheck->zEr
31b50 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b  rMsg;.    pCheck
31b60 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
31b70 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
31b80 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
31b90 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22  rMsg, zOld, "\n"
31ba0 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
31bb0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
31bc0 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b  qliteFree(zOld);
31bd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
31be0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
31bf0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
31c00 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
31c10 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  char*)0);.  }.  
31c20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 73 67 32  sqliteFree(zMsg2
31c30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
31c40 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
31c50 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
31c60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31c70 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
31c80 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
31c90 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
31ca0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
31cb0 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
31cc0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
31cd0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31ce0 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
31cf0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
31d00 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
31d10 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
31d20 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
31d30 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
31d40 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
31d50 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
31d60 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
31d70 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
31d80 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
31d90 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
31da0 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
31db0 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
31dc0 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
31dd0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
31de0 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68  k, int iPage, ch
31df0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
31e00 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
31e10 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
31e20 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
31e30 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29  age || iPage<0 )
31e40 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
31e50 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31e60 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20  ntext, "invalid 
31e70 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
31e80 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
31e90 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
31ea0 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69   pCheck->anRef[i
31eb0 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20  Page]==1 ){.    
31ec0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31ed0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
31ee0 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20   "2nd reference 
31ef0 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  to page %d", iPa
31f00 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
31f10 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
31f20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b   (pCheck->anRef[
31f30 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a  iPage]++)>1;.}..
31f40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31f50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
31f60 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
31f70 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
31f80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72   pointer-map for
31f90 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70   page iChild map
31fa0 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50  s to .** page iP
31fb0 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74  arent, pointer t
31fc0 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20  ype ptrType. If 
31fd0 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  not, append an e
31fe0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
31ff0 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  to pCheck..*/.st
32000 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
32010 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69  trmap(.  Integri
32020 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20  tyCk *pCheck,   
32030 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
32040 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ck context */.  
32050 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
32060 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
32070 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
32080 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
32090 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
320a0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
320b0 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  type */.  Pgno i
320c0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
320d0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
320e0 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20  nter map parent 
320f0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
32100 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
32110 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
32120 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28  xt description (
32130 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
32140 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sg) */.){.  int 
32150 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70  rc;.  u8 ePtrmap
32160 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Type;.  Pgno iPt
32170 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72  rmapParent;..  r
32180 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43  c = ptrmapGet(pC
32190 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c  heck->pBt, iChil
321a0 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c  d, &ePtrmapType,
321b0 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29   &iPtrmapParent)
321c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
321d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65  TE_OK ){.    che
321e0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
321f0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46  ck, zContext, "F
32200 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74  ailed to read pt
32210 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43  rmap key=%d", iC
32220 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
32230 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50  n;.  }..  if( eP
32240 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65  trmapType!=eType
32250 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e   || iPtrmapParen
32260 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20  t!=iParent ){.  
32270 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32280 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32290 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70  t, .      "Bad p
322a0 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79  tr map entry key
322b0 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64  =%d expected=(%d
322c0 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29  ,%d) got=(%d,%d)
322d0 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64  ", .      iChild
322e0 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74  , eType, iParent
322f0 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69  , ePtrmapType, i
32300 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
32310 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
32320 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  ** Check the int
32330 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
32340 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20  eelist or of an 
32350 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
32360 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  st..** Verify th
32370 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
32380 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69   pages on the li
32390 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74  st is N..*/.stat
323a0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73  ic void checkLis
323b0 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  t(.  IntegrityCk
323c0 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e   *pCheck,  /* In
323d0 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67  tegrity checking
323e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
323f0 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20  t isFreeList,   
32400 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
32410 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c  a freelist.  Fal
32420 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  se for overflow 
32430 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69  page list */.  i
32440 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
32450 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32460 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61  ber for first pa
32470 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  ge in the list *
32480 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
32490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
324a0 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
324b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
324c0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t */.  char *zCo
324d0 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20  ntext        /* 
324e0 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  Context for erro
324f0 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b  r messages */.){
32500 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
32510 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20  expected = N;.  
32520 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61  int iFirst = iPa
32530 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ge;.  while( N--
32540 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e   > 0 && pCheck->
32550 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50  mxErr ){.    DbP
32560 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a  age *pOvflPage;.
32570 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
32580 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20  r *pOvflData;.  
32590 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b    if( iPage<1 ){
325a0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
325b0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
325c0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
325d0 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73   "%d of %d pages
325e0 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76   missing from ov
325f0 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72  erflow list star
32600 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20  ting at %d",.   
32610 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65         N+1, expe
32620 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20  cted, iFirst);. 
32630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32640 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
32650 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
32660 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72  , zContext) ) br
32670 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
32680 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68  ite3PagerGet(pCh
32690 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67  eck->pPager, (Pg
326a0 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c  no)iPage, &pOvfl
326b0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63  Page) ){.      c
326c0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
326d0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
326e0 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70  "failed to get p
326f0 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
32700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32710 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74    }.    pOvflDat
32720 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
32730 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
32740 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61  rGetData(pOvflPa
32750 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46  ge);.    if( isF
32760 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
32770 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
32780 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29  e(&pOvflData[4])
32790 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
327a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
327b0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
327c0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
327d0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
327e0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
327f0 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
32800 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
32810 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
32820 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
32830 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e   n>pCheck->pBt->
32840 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29  usableSize/4-8 )
32850 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
32860 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32870 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
32880 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20        "freelist 
32890 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62  leaf count too b
328a0 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ig on page %d", 
328b0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
328c0 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  N--;.      }else
328d0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
328e0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
328f0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
32900 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  eePage = get4byt
32910 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69  e(&pOvflData[8+i
32920 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  *4]);.#ifndef SQ
32930 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32940 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69  CUUM.          i
32950 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
32960 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
32970 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50            checkP
32980 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46  trmap(pCheck, iF
32990 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  reePage, PTRMAP_
329a0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
329b0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
329c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
329d0 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43       checkRef(pC
329e0 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
329f0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
32a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20      }.        N 
32a10 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -= n;.      }.  
32a20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
32a30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32a40 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UM.    else{.   
32a50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61     /* If this da
32a60 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
32a70 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20  auto-vacuum and 
32a80 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65  iPage is not the
32a90 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70   last.      ** p
32aa0 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72  age in this over
32ab0 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b  flow list, check
32ac0 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
32ad0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r-map entry for.
32ae0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
32af0 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63  lowing page matc
32b00 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20  hes iPage..     
32b10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
32b20 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
32b30 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a  acuum && N>0 ){.
32b40 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34          i = get4
32b50 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
32b60 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
32b70 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
32b80 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
32b90 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
32ba0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
32bb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
32bc0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
32bd0 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71  vflData);.    sq
32be0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
32bf0 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a  pOvflPage);.  }.
32c00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
32c10 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
32c20 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
32c30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32c40 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
32c50 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73  /*.** Do various
32c60 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f   sanity checks o
32c70 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  n a single page 
32c80 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75  of a tree.  Retu
32c90 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64  rn.** the tree d
32ca0 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65  epth.  Root page
32cb0 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72  s return 0.  Par
32cc0 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67  ents of root pag
32cd0 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20  es.** return 1, 
32ce0 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  and so forth..**
32cf0 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b   .** These check
32d00 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a  s are done:.**.*
32d10 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20  *      1.  Make 
32d20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20  sure that cells 
32d30 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64  and freeblocks d
32d40 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a  o not overlap.**
32d50 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f            but co
32d60 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74  mbine to complet
32d70 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61  ely cover the pa
32d80 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20  ge..**  NO  2.  
32d90 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b  Make sure cell k
32da0 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72  eys are in order
32db0 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61  ..**  NO  3.  Ma
32dc0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
32dd0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
32de0 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f  qual to zLowerBo
32df0 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20  und..**  NO  4. 
32e00 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
32e10 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
32e20 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55  n or equal to zU
32e30 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20  pperBound..**   
32e40 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65     5.  Check the
32e50 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76   integrity of ov
32e60 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
32e70 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73        6.  Recurs
32e80 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b  ively call check
32e90 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20  TreePage on all 
32ea0 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20  children..**    
32eb0 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61    7.  Verify tha
32ec0 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  t the depth of a
32ed0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74  ll children is t
32ee0 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20  he same..**     
32ef0 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   8.  Make sure t
32f00 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c  his page is at l
32f10 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72  east 33% full or
32f20 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20   else it is.**  
32f30 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74          the root
32f40 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f   of the tree..*/
32f50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
32f60 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74  kTreePage(.  Int
32f70 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
32f80 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f  ,  /* Context fo
32f90 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  r the sanity che
32fa0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  ck */.  int iPag
32fb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
32fc0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
32fd0 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63  the page to chec
32fe0 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  k */.  MemPage *
32ff0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
33000 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  Parent page */. 
33010 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
33020 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
33030 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
33040 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
33050 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
33060 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
33070 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
33080 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
33090 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
330a0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
330b0 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
330c0 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
330d0 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
330e0 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 70 72 69  ar *hit;..  spri
330f0 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 50  ntf(zContext, "P
33100 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
33110 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
33120 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
33130 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
33140 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
33150 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
33160 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
33170 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
33180 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
33190 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
331a0 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
331b0 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
331c0 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 67  0;.  if( (rc = g
331d0 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
331e0 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  o)iPage, &pPage,
331f0 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63   0))!=0 ){.    c
33200 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
33210 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
33220 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
33230 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20  o get the page. 
33240 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20  error code=%d", 
33250 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
33260 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63  0;.  }.  if( (rc
33270 20 3d 20 69 6e 69 74 50 61 67 65 28 70 50 61 67   = initPage(pPag
33280 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d 30 20  e, pParent))!=0 
33290 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
332a0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
332b0 6f 6e 74 65 78 74 2c 20 22 69 6e 69 74 50 61 67  ontext, "initPag
332c0 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f  e() returns erro
332d0 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b  r code %d", rc);
332e0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
332f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
33300 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
33310 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74   Check out all t
33320 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20  he cells..  */. 
33330 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f   depth = 0;.  fo
33340 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
33350 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d  nCell && pCheck-
33360 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  >mxErr; i++){.  
33370 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
33380 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c   int sz;.    Cel
33390 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  lInfo info;..   
333a0 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61   /* Check payloa
333b0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  d overflow pages
333c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 70 72 69  .    */.    spri
333d0 6e 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f  ntf(zContext, "O
333e0 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
333f0 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
33400 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
33410 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
33420 2c 69 29 3b 0a 20 20 20 20 70 61 72 73 65 43 65  ,i);.    parseCe
33430 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
33440 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
33450 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b  sz = info.nData;
33460 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
33470 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20  >intKey ) sz += 
33480 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61  info.nKey;.    a
33490 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e  ssert( sz==info.
334a0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
334b0 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63  if( sz>info.nLoc
334c0 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
334d0 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e  nPage = (sz - in
334e0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62  fo.nLocal + usab
334f0 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61  leSize - 5)/(usa
33500 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
33510 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
33520 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
33530 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
33540 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ow]);.#ifndef SQ
33550 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33560 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
33570 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
33580 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
33590 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
335a0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
335b0 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c  VERFLOW1, iPage,
335c0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
335d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
335e0 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63   checkList(pChec
335f0 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  k, 0, pgnoOvfl, 
33600 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  nPage, zContext)
33610 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
33620 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20  Check sanity of 
33630 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e  left child page.
33640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33650 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
33660 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
33670 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69  4byte(pCell);.#i
33680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33690 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
336a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
336b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
336c0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
336d0 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
336e0 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
336f0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
33700 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
33710 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50   d2 = checkTreeP
33720 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c  age(pCheck,pgno,
33730 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b  pPage,zContext);
33740 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26  .      if( i>0 &
33750 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20  & d2!=depth ){. 
33760 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33770 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33780 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70  ontext, "Child p
33790 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72  age depth differ
337a0 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
337b0 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20     depth = d2;. 
337c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
337d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
337e0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
337f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
33800 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
33810 74 2b 38 5d 29 3b 0a 20 20 20 20 73 70 72 69 6e  t+8]);.    sprin
33820 74 66 28 7a 43 6f 6e 74 65 78 74 2c 20 22 4f 6e  tf(zContext, "On
33830 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68   page %d at righ
33840 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67  t child: ", iPag
33850 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
33860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33870 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
33880 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
33890 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
338a0 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
338b0 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
338c0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
338d0 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
338e0 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
338f0 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74  no, pPage, zCont
33900 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ext);.  }. .  /*
33910 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
33920 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
33930 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
33940 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
33950 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
33960 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
33970 20 68 69 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c   hit = sqliteMal
33980 6c 6f 63 28 20 75 73 61 62 6c 65 53 69 7a 65 20  loc( usableSize 
33990 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b 0a  );.  if( hit ){.
339a0 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c 20      memset(hit, 
339b0 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  1, get2byte(&dat
339c0 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20  a[hdr+5]));.    
339d0 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
339e0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
339f0 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d 20      cellStart = 
33a00 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
33a10 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f  ge->leaf;.    fo
33a20 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
33a30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
33a40 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
33a50 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a  ata[cellStart+i*
33a60 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  2]);.      int s
33a70 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
33a80 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
33a90 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  c]);.      int j
33aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63 2b  ;.      if( (pc+
33ab0 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
33ac0 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20  ize || pc<0 ){. 
33ad0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33ae0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
33af0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
33b00 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
33b10 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
33b20 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
33b30 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
33b40 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
33b50 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70  =pc+size-1; j>=p
33b60 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  c; j--) hit[j]++
33b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33b80 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69      for(cnt=0, i
33b90 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
33ba0 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20  hdr+1]); i>0 && 
33bb0 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  i<usableSize && 
33bc0 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20 20  cnt<10000; .    
33bd0 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20         cnt++){. 
33be0 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
33bf0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
33c00 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  +2]);.      int 
33c10 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 2b  j;.      if( (i+
33c20 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53  size-1)>=usableS
33c30 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20  ize || i<0 ){.  
33c40 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33c50 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
33c60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
33c70 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74  orruption detect
33c80 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e  ed in cell %d on
33c90 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61 67   page %d",i,iPag
33ca0 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e,0);.      }els
33cb0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
33cc0 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b  =i+size-1; j>=i;
33cd0 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a   j--) hit[j]++;.
33ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
33cf0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
33d00 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
33d10 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75  for(i=cnt=0; i<u
33d20 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  sableSize; i++){
33d30 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b 69  .      if( hit[i
33d40 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
33d50 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
33d60 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31 20  se if( hit[i]>1 
33d70 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33d80 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33d90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 22  , 0,.          "
33da0 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66 6f  Multiple uses fo
33db0 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61 67  r byte %d of pag
33dc0 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65 29  e %d", i, iPage)
33dd0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
33de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33df0 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74 61     if( cnt!=data
33e00 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20  [hdr+7] ){.     
33e10 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33e20 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
33e30 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74 65        "Fragmente
33e40 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62 79  d space is %d by
33e50 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 25  te reported as %
33e60 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a 20  d on page %d",. 
33e70 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64 61           cnt, da
33e80 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67 65  ta[hdr+7], iPage
33e90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
33ea0 71 6c 69 74 65 46 72 65 65 28 68 69 74 29 3b 0a  qliteFree(hit);.
33eb0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
33ec0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
33ed0 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69  depth+1;.}.#endi
33ee0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
33ef0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
33f00 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
33f10 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
33f20 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54  TY_CHECK./*.** T
33f30 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
33f40 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63   a complete chec
33f50 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42  k of the given B
33f60 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f  Tree file.  aRoo
33f70 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72  t[] is.** an arr
33f80 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62  ay of pages numb
33f90 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61  ers were each pa
33fa0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  ge number is the
33fb0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a   root page of.**
33fc0 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74   a table.  nRoot
33fd0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
33fe0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
33ff0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ot..**.** If eve
34000 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f  rything checks o
34010 75 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ut, this routine
34020 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20   returns NULL.  
34030 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a  If something is.
34040 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72  ** amiss, an err
34050 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
34060 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
34070 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
34080 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20  malloc().** and 
34090 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
340a0 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  t error message 
340b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  is returned.  Th
340c0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
340d0 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
340e0 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
340f0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
34100 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
34110 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ne..*/.char *sql
34120 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69  ite3BtreeIntegri
34130 74 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65  tyCheck(.  Btree
34140 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20   *p,     /* The 
34150 62 74 72 65 65 20 74 6f 20 62 65 20 63 68 65 63  btree to be chec
34160 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ked */.  int *aR
34170 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72  oot,   /* An arr
34180 61 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  ay of root pages
34190 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64   numbers for ind
341a0 69 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f  ividual trees */
341b0 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20  .  int nRoot,   
341c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
341d0 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d  tries in aRoot[]
341e0 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c   */.  int mxErr,
341f0 20 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f      /* Stop repo
34200 72 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74  rting errors aft
34210 65 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a  er this many */.
34220 20 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20    int *pnErr    
34230 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20  /* Write number 
34240 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74  of errors seen t
34250 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  o this variable 
34260 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
34270 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74   int nRef;.  Int
34280 65 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b  egrityCk sCheck;
34290 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
342a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 6e 52   = p->pBt;..  nR
342b0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
342c0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
342d0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f  Pager);.  if( lo
342e0 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
342f0 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  (p)!=SQLITE_OK )
34300 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
34310 69 74 65 53 74 72 44 75 70 28 22 55 6e 61 62 6c  iteStrDup("Unabl
34320 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72  e to acquire a r
34330 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
34340 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
34350 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
34360 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
34370 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
34380 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
34390 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
343a0 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b  Pagecount(sCheck
343b0 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65  .pPager);.  sChe
343c0 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72  ck.mxErr = mxErr
343d0 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20  ;.  sCheck.nErr 
343e0 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  = 0;.  *pnErr = 
343f0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
34400 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34410 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  M.  if( pBt->nTr
34420 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43  unc!=0 ){.    sC
34430 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74  heck.nPage = pBt
34440 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65  ->nTrunc;.  }.#e
34450 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63  ndif.  if( sChec
34460 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  k.nPage==0 ){.  
34470 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
34480 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
34490 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
344a0 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73  sCheck.anRef = s
344b0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
344c0 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29  (sCheck.nPage+1)
344d0 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61  *sizeof(sCheck.a
344e0 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66  nRef[0]) );.  if
344f0 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  ( !sCheck.anRef 
34500 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
34510 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
34520 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b  .    *pnErr = 1;
34530 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
34540 74 65 33 4d 50 72 69 6e 74 66 28 22 55 6e 61 62  te3MPrintf("Unab
34550 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20  le to malloc %d 
34560 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20  bytes", .       
34570 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
34580 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
34590 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a  anRef[0]));.  }.
345a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43    for(i=0; i<=sC
345b0 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29  heck.nPage; i++)
345c0 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  { sCheck.anRef[i
345d0 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50  ] = 0; }.  i = P
345e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
345f0 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d  (pBt);.  if( i<=
34600 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a  sCheck.nPage ){.
34610 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66      sCheck.anRef
34620 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  [i] = 1;.  }.  s
34630 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20  Check.zErrMsg = 
34640 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  0;..  /* Check t
34650 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
34660 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a  the freelist.  *
34670 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73  /.  checkList(&s
34680 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79  Check, 1, get4by
34690 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
346a0 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20  >aData[32]),.   
346b0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
346c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
346d0 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69  aData[36]), "Mai
346e0 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a  n freelist: ");.
346f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20  .  /* Check all 
34700 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  the tables..  */
34710 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
34720 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  oot && sCheck.mx
34730 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Err; i++){.    i
34740 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29  f( aRoot[i]==0 )
34750 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
34760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34770 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
34780 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
34790 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20  m && aRoot[i]>1 
347a0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74  ){.      checkPt
347b0 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52  rmap(&sCheck, aR
347c0 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52  oot[i], PTRMAP_R
347d0 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a  OOTPAGE, 0, 0);.
347e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
347f0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 26   checkTreePage(&
34800 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d  sCheck, aRoot[i]
34810 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72  , 0, "List of tr
34820 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20  ee roots: ");.  
34830 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
34840 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20  e every page in 
34850 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 66 65  the file is refe
34860 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f  renced.  */.  fo
34870 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b  r(i=1; i<=sCheck
34880 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65 63 6b  .nPage && sCheck
34890 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69  .mxErr; i++){.#i
348a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
348b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
348c0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
348d0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
348e0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
348f0 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
34900 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
34910 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65  d", i);.    }.#e
34920 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  lse.    /* If th
34930 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
34940 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
34950 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61   make sure no ta
34960 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20  bles contain.   
34970 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
34980 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  o pointer-map pa
34990 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ges..    */.    
349a0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
349b0 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20  [i]==0 && .     
349c0 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f    (PTRMAP_PAGENO
349d0 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21  (pBt, i)!=i || !
349e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
349f0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
34a00 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
34a10 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73  , 0, "Page %d is
34a20 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29   never used", i)
34a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34a40 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21  sCheck.anRef[i]!
34a50 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
34a60 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
34a70 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e  , i)==i && pBt->
34a80 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20  autoVacuum) ){. 
34a90 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
34aa0 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
34ab0 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67  "Pointer map pag
34ac0 65 20 25 64 20 69 73 20 72 65 66 65 72 65 6e 63  e %d is referenc
34ad0 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  ed", i);.    }.#
34ae0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
34af0 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 61  Make sure this a
34b00 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20  nalysis did not 
34b10 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28  leave any unref(
34b20 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75  ) pages.  */.  u
34b30 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
34b40 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e  ed(pBt);.  if( n
34b50 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61  Ref != sqlite3Pa
34b60 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
34b70 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
34b80 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
34b90 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  sCheck, 0, .    
34ba0 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70    "Outstanding p
34bb0 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66  age count goes f
34bc0 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72  rom %d to %d dur
34bd0 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69  ing this analysi
34be0 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20  s",.      nRef, 
34bf0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
34c00 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
34c10 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ).    );.  }..  
34c20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64  /* Clean  up and
34c30 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a   report errors..
34c40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65    */.  sqliteFre
34c50 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
34c60 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65  .  *pnErr = sChe
34c70 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75 72  ck.nErr;.  retur
34c80 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67  n sCheck.zErrMsg
34c90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
34ca0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
34cb0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a  ITY_CHECK */../*
34cc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
34cd0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
34ce0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
34cf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
34d00 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
34d10 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
34d20 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
34d30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
34d40 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
34d50 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34d60 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
34d70 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
34d80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34d90 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
34da0 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
34db0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
34dc0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
34dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
34de0 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
34df0 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
34e00 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
34e10 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
34e20 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
34e30 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74  erDirname(p->pBt
34e40 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
34e50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
34e60 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
34e70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
34e80 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54  this database. T
34e90 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
34ea0 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ue of this routi
34eb0 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  ne is the same r
34ec0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
34ed0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
34ee0 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
34ef0 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74  n created or not
34f00 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
34f10 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  *sqlite3BtreeGet
34f20 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65  Journalname(Btre
34f30 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
34f40 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
34f50 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
34f60 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
34f70 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  alname(p->pBt->p
34f80 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64  Pager);.}..#ifnd
34f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
34fa0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  ACUUM./*.** Copy
34fb0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
34fc0 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d  ntent of pBtFrom
34fd0 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20   into pBtTo.  A 
34fe0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d  transaction.** m
34ff0 75 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f  ust be active fo
35000 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a  r both files..**
35010 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
35020 66 69 6c 65 20 70 42 74 46 72 6f 6d 20 6d 61 79  file pBtFrom may
35030 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
35040 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
35050 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
35060 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
35070 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 42 74  ansaction on pBt
35080 46 72 6f 6d 20 69 73 20 72 6f 6c 6c 65 64 20 62  From is rolled b
35090 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ack..*/.int sqli
350a0 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65  te3BtreeCopyFile
350b0 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72  (Btree *pTo, Btr
350c0 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e  ee *pFrom){.  in
350d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
350e0 3b 0a 20 20 50 67 6e 6f 20 69 2c 20 6e 50 61 67  ;.  Pgno i, nPag
350f0 65 2c 20 6e 54 6f 50 61 67 65 2c 20 69 53 6b 69  e, nToPage, iSki
35100 70 3b 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p;..  BtShared *
35110 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74  pBtTo = pTo->pBt
35120 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
35130 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70  tFrom = pFrom->p
35140 42 74 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e  Bt;..  if( pTo->
35150 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
35160 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69  RITE || pFrom->i
35170 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
35180 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
35190 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
351a0 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d    }.  if( pBtTo-
351b0 3e 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72  >pCursor ) retur
351c0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
351d0 20 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74   nToPage = sqlit
351e0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
351f0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b  (pBtTo->pPager);
35200 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  .  nPage = sqlit
35210 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
35220 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
35230 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e  );.  iSkip = PEN
35240 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
35250 42 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31  BtTo);.  for(i=1
35260 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
35270 26 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b  && i<=nPage; i++
35280 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
35290 44 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  DbPage;.    if( 
352a0 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69  i==iSkip ) conti
352b0 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  nue;.    rc = sq
352c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
352d0 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69  tFrom->pPager, i
352e0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
352f0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
35300 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35310 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28  3PagerOverwrite(
35320 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69  pBtTo->pPager, i
35330 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  , sqlite3PagerGe
35340 74 44 61 74 61 28 70 44 62 50 61 67 65 29 29 3b  tData(pDbPage));
35350 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
35360 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
35370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
35380 65 20 66 69 6c 65 20 69 73 20 73 68 72 69 6e 6b  e file is shrink
35390 69 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65  ing, journal the
353a0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
353b0 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 0a  being truncated.
353c0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
353d0 79 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  y can be rolled 
353e0 62 61 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d  back if the comm
353f0 69 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20  it fails..  */. 
35400 20 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20   for(i=nPage+1; 
35410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35420 20 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b   i<=nToPage; i++
35430 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
35440 44 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  DbPage;.    if( 
35450 69 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69  i==iSkip ) conti
35460 6e 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  nue;.    rc = sq
35470 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
35480 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
35490 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  &pDbPage);.    i
354a0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
354b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
354c0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
354d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  e);.    sqlite3P
354e0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44  agerDontWrite(pD
354f0 62 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59  bPage);.    /* Y
35500 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77  eah.  It seems w
35510 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e  ierd to call Don
35520 74 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61  tWrite() right a
35530 66 74 65 72 20 57 72 69 74 65 28 29 2e 20 20 42  fter Write().  B
35540 75 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ut.    ** that i
35550 73 20 62 65 63 61 75 73 65 20 74 68 65 20 6e 61  s because the na
35560 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f  mes of those pro
35570 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65  cedures do not e
35580 78 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72  xactly .    ** r
35590 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68  epresent what th
355a0 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20  ey do.  Write() 
355b0 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75  really means "pu
355c0 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74  t this page in t
355d0 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  he.    ** rollba
355e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ck journal and m
355f0 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20  ark it as dirty 
35600 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
35610 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  be written.    *
35620 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
35630 65 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20  e file later."  
35640 44 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f  DontWrite() undo
35650 65 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  es the second pa
35660 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61  rt of.    ** tha
35670 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74  t and prevents t
35680 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69  he page from bei
35690 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ng written to th
356a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
356b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
356c0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c  still on the rol
356d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
356e0 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74  hough.  And that
356f0 20 69 73 20 74 68 65 20 77 68 6f 6c 65 0a 20 20   is the whole.  
35700 20 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68    ** point of th
35710 69 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20  is loop: to put 
35720 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c  pages on the rol
35730 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a  lback journal. *
35740 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
35750 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
35760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
35770 26 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65  && nPage<nToPage
35780 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
35790 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
357a0 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  e(pBtTo->pPager,
357b0 20 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   nPage);.  }..  
357c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
357d0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
357e0 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72  ck(pTo);.  }.  r
357f0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 23 65  eturn rc;  .}.#e
35800 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
35810 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  MIT_VACUUM */../
35820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
35830 7a 65 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61  zero if a transa
35840 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
35850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
35860 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74  treeIsInTrans(Bt
35870 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
35880 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72  n (p && (p->inTr
35890 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
358a0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
358b0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
358c0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
358d0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
358e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
358f0 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42  3BtreeIsInStmt(B
35900 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
35910 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70 2d  rn (p->pBt && p-
35920 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a 7d  >pBt->inStmt);.}
35930 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ../*.** Return n
35940 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65 61  on-zero if a rea
35950 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72 61  d (or write) tra
35960 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
35970 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
35980 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54  e3BtreeIsInReadT
35990 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
359a0 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
359b0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
359c0 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a  S_NONE));.}../*.
359d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
359e0 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
359f0 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20  er to a blob of 
35a00 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
35a10 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
35a20 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  le shared-btree.
35a30 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75   The memory is u
35a40 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f  sed by client co
35a50 64 65 20 66 6f 72 20 69 74 27 73 20 6f 77 6e 0a  de for it's own.
35a60 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72  ** purposes (for
35a70 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f   example, to sto
35a80 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20  re a high-level 
35a90 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65  schema associate
35aa0 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73  d with .** the s
35ab0 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68  hared-btree). Th
35ac0 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61  e btree layer ma
35ad0 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65 20  nages reference 
35ae0 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e  counting issues.
35af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
35b00 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63 61   time this is ca
35b10 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64  lled on a shared
35b20 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62  -btree, nBytes b
35b30 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
35b40 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c  * are allocated,
35b50 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74   zeroed, and ret
35b60 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
35b70 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75  ler. For each su
35b80 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c  bsequent .** cal
35b90 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61 72  l the nBytes par
35ba0 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
35bb0 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  d and a pointer 
35bc0 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62  to the same blob
35bd0 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  .** of memory re
35be0 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 4a  turned. .**.** J
35bf0 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73  ust before the s
35c00 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63  hared-btree is c
35c10 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  losed, the funct
35c20 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68  ion passed as th
35c30 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75  e .** xFree argu
35c40 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65  ment when the me
35c50 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
35c60 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f  was made is invo
35c70 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62  ked on the .** b
35c80 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  lob of allocated
35c90 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75   memory. This fu
35ca0 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
35cb0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 46 72 65  t call sqliteFre
35cc0 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65  e().** on the me
35cd0 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20  mory, the btree 
35ce0 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e  layer does that.
35cf0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
35d00 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72  3BtreeSchema(Btr
35d10 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ee *p, int nByte
35d20 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28  s, void(*xFree)(
35d30 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68  void *)){.  BtSh
35d40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
35d50 42 74 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  Bt;.  if( !pBt->
35d60 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70  pSchema ){.    p
35d70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71  Bt->pSchema = sq
35d80 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  liteMalloc(nByte
35d90 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46 72  s);.    pBt->xFr
35da0 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65 65  eeSchema = xFree
35db0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
35dc0 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a  Bt->pSchema;.}..
35dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
35de0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65  e if another use
35df0 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68  r of the same sh
35e00 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74 68  ared btree as th
35e10 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61  e argument.** ha
35e20 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78  ndle holds an ex
35e30 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
35e40 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
35e50 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  r table..*/.int 
35e60 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
35e70 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  maLocked(Btree *
35e80 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 71 75  p){.  return (qu
35e90 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
35ea0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
35eb0 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f  D_LOCK)!=SQLITE_
35ec0 4f 4b 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  OK);.}...#ifndef
35ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
35ee0 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
35ef0 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  Obtain a lock on
35f00 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65   the table whose
35f10 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54   root page is iT
35f20 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b  ab.  The.** lock
35f30 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   is a write lock
35f40 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20   if isWritelock 
35f50 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61  is true or a rea
35f60 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20  d lock.** if it 
35f70 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74  is false..*/.int
35f80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63   sqlite3BtreeLoc
35f90 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  kTable(Btree *p,
35fa0 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73   int iTab, u8 is
35fb0 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  WriteLock){.  in
35fc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35fd0 3b 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20  ;.  u8 lockType 
35fe0 3d 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57  = (isWriteLock?W
35ff0 52 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c  RITE_LOCK:READ_L
36000 4f 43 4b 29 3b 0a 20 20 72 63 20 3d 20 71 75 65  OCK);.  rc = que
36010 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
36020 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
36030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36040 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
36050 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61  lockTable(p, iTa
36060 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
36070 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36080 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
36090 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
360a0 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75  RBLOB./*.** Argu
360b0 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62  ment pCsr must b
360c0 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  e a cursor opene
360d0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e  d for writing on
360e0 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74   an .** INTKEY t
360f0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70  able currently p
36100 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
36110 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  id table entry. 
36120 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
36130 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64  n modifies the d
36140 61 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61  ata stored as pa
36150 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79  rt of that entry
36160 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61  ..** Only the da
36170 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f  ta content may o
36180 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  nly be modified,
36190 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
361a0 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65  ble.** to change
361b0 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
361c0 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a  he data stored..
361d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
361e0 72 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72  reePutData(BtCur
361f0 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f  sor *pCsr, u32 o
36200 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
36210 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 29 7b 0a  const void *z){.
36220 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
36230 3d 20 70 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCsr->pBtree->
36240 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pBt;.  int rc;..
36250 20 20 75 33 32 20 69 52 65 6d 20 3d 20 61 6d 74    u32 iRem = amt
36260 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61  ;        /* Rema
36270 69 6e 69 6e 67 20 62 79 74 65 73 20 74 6f 20 77  ining bytes to w
36280 72 69 74 65 20 2a 2f 0a 20 20 75 38 20 2a 7a 52  rite */.  u8 *zR
36290 65 6d 20 3d 20 28 75 38 20 2a 29 7a 3b 20 20 20  em = (u8 *)z;   
362a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
362b0 61 74 61 20 6e 6f 74 20 79 65 74 20 77 72 69 74  ata not yet writ
362c0 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 69 4f 66  ten */.  u32 iOf
362d0 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 20 20  fset = offset;  
362e0 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 74  /* Offset from t
362f0 72 61 76 65 72 73 61 6c 20 70 6f 69 6e 74 20 74  raversal point t
36300 6f 20 73 74 61 72 74 20 6f 66 20 77 72 69 74 65  o start of write
36310 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 4f 76 66   */..  Pgno iOvf
36320 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
36330 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
36340 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
36350 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 76 66  age */.  int ovf
36360 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
36370 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61  /* Bytes of data
36380 20 70 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 61   per overflow pa
36390 67 65 2e 20 2a 2f 0a 0a 20 20 43 65 6c 6c 49 6e  ge. */..  CellIn
363a0 66 6f 20 2a 70 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  fo *pInfo;..  /*
363b0 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65 63   Check some prec
363c0 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a  onditions: .  **
363d0 20 20 20 28 61 29 20 61 20 77 72 69 74 65 2d 74     (a) a write-t
363e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
363f0 65 6e 2c 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  en, .  **   (b) 
36400 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
36410 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a  en for writing,.
36420 20 20 2a 2a 20 20 20 28 63 29 20 74 68 65 72 65    **   (c) there
36430 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b   is no read-lock
36440 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   on the table be
36450 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  ing modified and
36460 0a 20 20 2a 2a 20 20 20 28 64 29 20 74 68 65 20  .  **   (d) the 
36470 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74  cursor points at
36480 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f 66 20   a valid row of 
36490 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e  an intKey table.
364a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
364b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
364c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
364d0 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
364e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
364f0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
36500 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 65 74  nsert */.    ret
36510 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
36520 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
36530 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
36540 4f 52 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OR;.  }.  assert
36550 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
36560 20 29 3b 0a 20 20 69 66 28 20 21 70 43 73 72 2d   );.  if( !pCsr-
36570 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
36580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
36590 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  M;   /* Cursor n
365a0 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  ot open for writ
365b0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
365c0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
365d0 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCsr->pBtree, pC
365e0 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  sr->pgnoRoot, pC
365f0 73 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sr) ){.    retur
36600 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
36610 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
36620 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
36630 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
36640 20 20 7d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e    }.  if( pCsr->
36650 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
36660 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d  NVALID || !pCsr-
36670 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  >pPage->intKey )
36680 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
36690 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
366a0 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 63    /* Parse the c
366b0 65 6c 6c 2d 69 6e 66 6f 2e 20 43 68 65 63 6b 20  ell-info. Check 
366c0 74 68 61 74 20 74 68 65 20 63 65 6c 6c 2d 64 61  that the cell-da
366d0 74 61 20 61 72 65 61 20 69 73 20 6c 61 72 67 65  ta area is large
366e0 0a 20 20 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  .  ** enough for
366f0 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 77 72   the proposed wr
36700 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  ite operation.. 
36710 20 2a 2f 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   */.  getCellInf
36720 6f 28 70 43 73 72 29 3b 0a 20 20 70 49 6e 66 6f  o(pCsr);.  pInfo
36730 20 3d 20 26 70 43 73 72 2d 3e 69 6e 66 6f 3b 0a   = &pCsr->info;.
36740 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 44 61    if( pInfo->nDa
36750 74 61 3c 28 6f 66 66 73 65 74 2b 61 6d 74 29 20  ta<(offset+amt) 
36760 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36770 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
36780 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
36790 6f 63 61 6c 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ocal>iOffset ){.
367a0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
367b0 61 73 65 20 64 61 74 61 20 6d 75 73 74 20 62 65  ase data must be
367c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
367d0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
367e0 20 20 20 20 69 6e 74 20 69 57 72 69 74 65 20 3d      int iWrite =
367f0 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2d   pInfo->nLocal -
36800 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28   offset;.    if(
36810 20 69 57 72 69 74 65 3e 69 52 65 6d 20 29 7b 0a   iWrite>iRem ){.
36820 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 69        iWrite = i
36830 52 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  Rem;.    }.    r
36840 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36850 57 72 69 74 65 28 70 43 73 72 2d 3e 70 50 61 67  Write(pCsr->pPag
36860 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
36870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
36890 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
368a0 20 6d 65 6d 63 70 79 28 26 70 49 6e 66 6f 2d 3e   memcpy(&pInfo->
368b0 70 43 65 6c 6c 5b 69 4f 66 66 73 65 74 2b 70 49  pCell[iOffset+pI
368c0 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 5d 2c 20 7a  nfo->nHeader], z
368d0 52 65 6d 2c 20 69 57 72 69 74 65 29 3b 0a 0a 20  Rem, iWrite);.. 
368e0 20 20 20 7a 52 65 6d 20 2b 3d 20 69 57 72 69 74     zRem += iWrit
368f0 65 3b 0a 20 20 20 20 69 52 65 6d 20 2d 3d 20 69  e;.    iRem -= i
36900 57 72 69 74 65 3b 0a 20 20 7d 0a 20 20 69 4f 66  Write;.  }.  iOf
36910 66 73 65 74 20 3d 20 28 28 69 4f 66 66 73 65 74  fset = ((iOffset
36920 3c 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 29 3f  <pInfo->nLocal)?
36930 30 3a 28 69 4f 66 66 73 65 74 2d 70 49 6e 66 6f  0:(iOffset-pInfo
36940 2d 3e 6e 4c 6f 63 61 6c 29 29 3b 0a 0a 20 20 6f  ->nLocal));..  o
36950 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
36960 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
36970 20 61 73 73 65 72 74 28 70 49 6e 66 6f 2d 3e 69   assert(pInfo->i
36980 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 52  Overflow>0 || iR
36990 65 6d 3d 3d 30 29 3b 0a 20 20 69 4f 76 66 6c 20  em==0);.  iOvfl 
369a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 49 6e 66  = get4byte(&pInf
369b0 6f 2d 3e 70 43 65 6c 6c 5b 70 49 6e 66 6f 2d 3e  o->pCell[pInfo->
369c0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 77  iOverflow]);.  w
369d0 68 69 6c 65 28 20 69 52 65 6d 3e 30 20 29 7b 0a  hile( iRem>0 ){.
369e0 20 20 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e      if( iOffset>
369f0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
36a00 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
36a10 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
36a20 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
36a30 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
36a40 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
36a50 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
36a60 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
36a70 68 61 69 6e 2e 20 53 6f 20 74 72 79 0a 20 20 20  hain. So try.   
36a80 20 20 20 2a 2a 20 74 68 65 20 67 65 74 4f 76 65     ** the getOve
36a90 72 66 6c 6f 77 50 61 67 65 28 29 20 73 68 6f 72  rflowPage() shor
36aa0 74 63 75 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tcut.  */.      
36ab0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
36ac0 50 61 67 65 28 70 42 74 2c 20 69 4f 76 66 6c 2c  Page(pBt, iOvfl,
36ad0 20 30 2c 20 26 69 4f 76 66 6c 29 3b 0a 20 20 20   0, &iOvfl);.   
36ae0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36af0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36b10 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 73 65 74   }.      iOffset
36b20 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
36b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
36b40 6e 74 20 69 57 72 69 74 65 20 3d 20 6f 76 66 6c  nt iWrite = ovfl
36b50 53 69 7a 65 20 2d 20 69 4f 66 66 73 65 74 3b 0a  Size - iOffset;.
36b60 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f        DbPage *pO
36b70 76 66 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  vfl;          /*
36b80 20 54 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   The overflow pa
36b90 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
36ba0 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
36bb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74       /* Page dat
36bc0 61 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  a */..      rc =
36bd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36be0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4f  (pBt->pPager, iO
36bf0 76 66 6c 2c 20 26 70 4f 76 66 6c 29 3b 0a 20 20  vfl, &pOvfl);.  
36c00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36c30 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
36c40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36c50 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69  (pOvfl);.      i
36c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36c70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36c80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
36c90 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  vfl);.        re
36ca0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
36cb0 0a 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d 20  ..      aData = 
36cc0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
36cd0 61 74 61 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  ata(pOvfl);.    
36ce0 20 20 69 4f 76 66 6c 20 3d 20 67 65 74 34 62 79    iOvfl = get4by
36cf0 74 65 28 61 44 61 74 61 29 3b 0a 20 20 20 20 20  te(aData);.     
36d00 20 69 66 28 20 69 57 72 69 74 65 3e 69 52 65 6d   if( iWrite>iRem
36d10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 57 72 69   ){.        iWri
36d20 74 65 20 3d 20 69 52 65 6d 3b 0a 20 20 20 20 20  te = iRem;.     
36d30 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
36d40 26 61 44 61 74 61 5b 69 4f 66 66 73 65 74 2b 34  &aData[iOffset+4
36d50 5d 2c 20 7a 52 65 6d 2c 20 69 57 72 69 74 65 29  ], zRem, iWrite)
36d60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
36d70 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 29  agerUnref(pOvfl)
36d80 3b 0a 0a 20 20 20 20 20 20 7a 52 65 6d 20 2b 3d  ;..      zRem +=
36d90 20 69 57 72 69 74 65 3b 0a 20 20 20 20 20 20 69   iWrite;.      i
36da0 52 65 6d 20 2d 3d 20 69 57 72 69 74 65 3b 0a 20  Rem -= iWrite;. 
36db0 20 20 20 20 20 69 4f 66 66 73 65 74 20 3d 20 28       iOffset = (
36dc0 28 69 4f 66 66 73 65 74 3c 6f 76 66 6c 53 69 7a  (iOffset<ovflSiz
36dd0 65 29 3f 30 3a 28 69 4f 66 66 73 65 74 2d 6f 76  e)?0:(iOffset-ov
36de0 66 6c 53 69 7a 65 29 29 3b 0a 20 20 20 20 7d 0a  flSize));.    }.
36df0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
36e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
36e10 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
36e20 6c 6f 77 69 6e 67 20 64 65 62 75 67 67 69 6e 67  lowing debugging
36e30 20 69 6e 74 65 72 66 61 63 65 20 68 61 73 20 74   interface has t
36e40 6f 20 62 65 20 69 6e 20 74 68 69 73 20 66 69 6c  o be in this fil
36e50 65 20 28 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  e (rather.** tha
36e60 6e 20 69 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  n in, for exampl
36e70 65 2c 20 74 65 73 74 31 2e 63 29 20 73 6f 20 74  e, test1.c) so t
36e80 68 61 74 20 69 74 20 63 61 6e 20 67 65 74 20 61  hat it can get a
36e90 63 63 65 73 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ccess to.** the 
36ea0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 42 74  definition of Bt
36eb0 53 68 61 72 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  Shared..*/.#if d
36ec0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
36ed0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
36ee0 54 43 4c 53 48 29 0a 23 69 6e 63 6c 75 64 65 20  TCLSH).#include 
36ef0 3c 74 63 6c 2e 68 3e 0a 69 6e 74 20 73 71 6c 69  <tcl.h>.int sqli
36f00 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65  te3_shared_cache
36f10 5f 72 65 70 6f 72 74 28 0a 20 20 76 6f 69 64 20  _report(.  void 
36f20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
36f30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
36f40 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
36f50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
36f60 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
36f70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
36f80 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 63 6f  HARED_CACHE.  co
36f90 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
36fa0 70 54 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  pTd = sqlite3Thr
36fb0 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
36fc0 29 3b 0a 20 20 69 66 28 20 70 54 64 2d 3e 75 73  );.  if( pTd->us
36fd0 65 53 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20  eSharedData ){. 
36fe0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
36ff0 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ;.    Tcl_Obj *p
37000 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
37010 28 29 3b 0a 20 20 20 20 66 6f 72 28 70 42 74 3d  ();.    for(pBt=
37020 70 54 64 2d 3e 70 42 74 72 65 65 3b 20 70 42 74  pTd->pBtree; pBt
37030 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
37040 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
37050 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  har *zFile = sql
37060 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
37070 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
37080 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
37090 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
370a0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
370b0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 46  _NewStringObj(zF
370c0 69 6c 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20  ile, -1));.     
370d0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
370e0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
370f0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
37100 6e 74 4f 62 6a 28 70 42 74 2d 3e 6e 52 65 66 29  ntObj(pBt->nRef)
37110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
37120 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
37130 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
37140 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
37150 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
37160 66 0a                                            f.