/ Hex Artifact Content
Login

Artifact 5164b32950cfd41f2c5c31e8ff82c4a499918aef:


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 34 33 36 20 32 30 30 38 2f 30  c,v 1.436 2008/0
0190: 31 2f 30 32 20 31 31 3a 35 30 3a 35 31 20 64 61  1/02 11:50:51 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 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
0390: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  ST.int sqlite3_b
03a0: 74 72 65 65 5f 74 72 61 63 65 3d 30 3b 20 20 2f  tree_trace=0;  /
03b0: 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65  * True to enable
03c0: 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e 64   tracing */.#end
03d0: 69 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  if....#ifndef SQ
03e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
03f0: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66  _CACHE./*.** A f
0400: 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
0410: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73  whether or not s
0420: 68 61 72 65 64 20 63 61 63 68 65 20 69 73 20 65  hared cache is e
0430: 6e 61 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a  nabled.  Also,.*
0440: 2a 20 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * a list of BtSh
0450: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0460: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0470: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0480: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0490: 63 68 65 2e 20 20 54 68 65 20 76 61 72 69 61 62  che.  The variab
04a0: 6c 65 73 20 68 61 76 65 20 66 69 6c 65 20 73 63  les have file sc
04b0: 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ope during norma
04c0: 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74  l builds,.** but
04d0: 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73   the test harnes
04e0: 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73  s needs to acces
04f0: 73 20 74 68 65 73 65 20 76 61 72 69 61 62 6c 65  s these variable
0500: 73 20 73 6f 20 77 65 20 6d 61 6b 65 20 74 68 65  s so we make the
0510: 6d 0a 2a 2a 20 67 6c 6f 62 61 6c 20 66 6f 72 20  m.** global for 
0520: 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  test builds..*/.
0530: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0540: 53 54 0a 42 74 53 68 61 72 65 64 20 2a 73 71 6c  ST.BtShared *sql
0550: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
0560: 69 73 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  ist = 0;.int sql
0570: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
0580: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 65 6c 73  nabled = 0;.#els
0590: 65 0a 73 74 61 74 69 63 20 42 74 53 68 61 72 65  e.static BtShare
05a0: 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64  d *sqlite3Shared
05b0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 73  CacheList = 0;.s
05c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
05d0: 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  3SharedCacheEnab
05e0: 6c 65 64 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  led = 0;.#endif.
05f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0600: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0610: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
0620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0630: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e  D_CACHE./*.** En
0640: 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
0650: 74 68 65 20 73 68 61 72 65 64 20 70 61 67 65 72  the shared pager
0660: 20 61 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74   and schema feat
0670: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ures..**.** This
0680: 20 72 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20   routine has no 
0690: 65 66 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69  effect on existi
06a0: 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
06b0: 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20  ections..** The 
06c0: 73 68 61 72 65 64 20 63 61 63 68 65 20 73 65 74  shared cache set
06d0: 74 69 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c  ting effects onl
06e0: 79 20 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74  y future calls t
06f0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  o.** sqlite3_ope
0700: 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65  n(), sqlite3_ope
0710: 6e 31 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65  n16(), or sqlite
0720: 33 5f 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a  3_open_v2()..*/.
0730: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  int sqlite3_enab
0740: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28  le_shared_cache(
0750: 69 6e 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73  int enable){.  s
0760: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
0770: 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c  eEnabled = enabl
0780: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
0790: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
07a0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
07b0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
07c0: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
07d0: 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c  eadLocks(Btree*,
07e0: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
07f0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
0800: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0810: 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  HE.  /*.  ** The
0820: 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79   functions query
0830: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63  TableLock(), loc
0840: 6b 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c  kTable() and unl
0850: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20  ockAllTables(). 
0860: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0870: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0880: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0890: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
08a0: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08c0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08d0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08e0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08f0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
0900: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0910: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0920: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0930: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0940: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0950: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0960: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0970: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0980: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0990: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
09a0: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09b0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09c0: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61  queryTableLock(a
09d0: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
09e0: 20 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61    #define lockTa
09f0: 62 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ble(a,b,c) SQLIT
0a00: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75  E_OK.  #define u
0a10: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61  nlockAllTables(a
0a20: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
0a30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0a40: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
0a50: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
0a60: 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   btree handle p 
0a70: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
0a80: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
0a90: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
0aa0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
0ab0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
0ac0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
0ad0: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
0ae0: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
0af0: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
0b00: 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b  (by calling lock
0b10: 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20  Table()), or.** 
0b20: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
0b30: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
0b40: 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  int queryTableLo
0b50: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
0b60: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
0b70: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
0b80: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
0b90: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
0ba0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0bb0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
0bc0: 70 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  p) );.  .  /* Th
0bd0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
0be0: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
0bf0: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
0c00: 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   */.  if( !p->sh
0c10: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  arable ){.    re
0c20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0c30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d    }..  /* If som
0c40: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
0c50: 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  on is holding an
0c60: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
0c70: 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73   the.  ** reques
0c80: 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74  ted lock may not
0c90: 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20   be obtained..  
0ca0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45  */.  if( pBt->pE
0cb0: 78 63 6c 75 73 69 76 65 20 26 26 20 70 42 74 2d  xclusive && pBt-
0cc0: 3e 70 45 78 63 6c 75 73 69 76 65 21 3d 70 20 29  >pExclusive!=p )
0cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0ce0: 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a  ITE_LOCKED;.  }.
0cf0: 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e  .  /* This (alon
0d00: 67 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65  g with lockTable
0d10: 28 29 29 20 69 73 20 77 68 65 72 65 20 74 68 65  ()) is where the
0d20: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0d30: 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65   flag is.  ** de
0d40: 61 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68 65  alt with. If the
0d50: 20 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79   caller is query
0d60: 69 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c  ing for a read-l
0d70: 6f 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67  ock and the flag
0d80: 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74   is.  ** set, it
0d90: 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   is unconditiona
0da0: 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76  lly granted - ev
0db0: 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  en if there are 
0dc0: 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a  write-locks.  **
0dd0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49   on the table. I
0de0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  f a write-lock i
0df0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
0e00: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0e10: 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f   flag.  ** is no
0e20: 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20  t considered..  
0e30: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74  **.  ** In funct
0e40: 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c  ion lockTable(),
0e50: 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20   if a read-lock 
0e60: 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20  is demanded and 
0e70: 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e  the .  ** ReadUn
0e80: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
0e90: 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20  s set, no entry 
0ea0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
0eb0: 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a  locks list .  **
0ec0: 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b   (BtShared.pLock
0ed0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20  )..  **.  ** To 
0ee0: 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68  summarize: If th
0ef0: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0f00: 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  d flag is set, t
0f10: 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73  hen read cursors
0f20: 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65   do.  ** not cre
0f30: 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74  ate or respect t
0f40: 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20  able locks. The 
0f50: 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72  locking procedur
0f60: 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72  e for a .  ** wr
0f70: 69 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20  ite-cursor does 
0f80: 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  not change..  */
0f90: 0a 20 20 69 66 28 20 0a 20 20 20 20 21 70 2d 3e  .  if( .    !p->
0fa0: 64 62 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70  db || .    0==(p
0fb0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
0fc0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
0fd0: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
0fe0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
0ff0: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
1000: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1010: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1020: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1030: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1040: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
1050: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
1060: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
1070: 54 61 62 20 26 26 20 0a 20 20 20 20 20 20 20 20  Tab && .        
1080: 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21    (pIter->eLock!
1090: 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21  =eLock || eLock!
10a0: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  =READ_LOCK) ){. 
10b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10c0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
10d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10f0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
1100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1110: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
1120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1130: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
1140: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
1150: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1160: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
1170: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
1180: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
1190: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
11a0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
11b0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
11c0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
11d0: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
11e0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
11f0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1200: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
1210: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
1220: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53  TE_BUSY and.** S
1230: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20  QLITE_NOMEM may 
1240: 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64  also be returned
1250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1260: 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  lockTable(Btree 
1270: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1280: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1290: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12a0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
12b0: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
12c0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
12d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
12e0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
12f0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69   );..  /* This i
1300: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
1310: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
1320: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
1330: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
1340: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
1350: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1360: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
1370: 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65  E_OK==queryTable
1380: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1390: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
13a0: 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  If the read-unco
13b0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
13c0: 73 65 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c  set and a read-l
13d0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
13e0: 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61  ,.  ** return ea
13f0: 72 6c 79 20 77 69 74 68 6f 75 74 20 61 64 64 69  rly without addi
1400: 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  ng an entry to t
1410: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
1420: 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a  k list. See.  **
1430: 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63   comment in func
1440: 74 69 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c  tion queryTableL
1450: 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69  ock() for more i
1460: 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20  nfo on handling 
1470: 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e  .  ** the ReadUn
1480: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a  committed flag..
1490: 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
14a0: 28 70 2d 3e 64 62 29 20 26 26 20 0a 20 20 20 20  (p->db) && .    
14b0: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  (p->db->flags&SQ
14c0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
14d0: 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28 65  tted) && .    (e
14e0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
14f0: 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d   &&.    iTable!=
1500: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1510: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1520: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1530: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
1540: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
1550: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
1560: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
1570: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1580: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1590: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
15a0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
15b0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
15c0: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
15d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
15e0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
15f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1600: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1610: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
1620: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
1630: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
1640: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
1650: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
1660: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
1670: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
1680: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
1690: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
16a0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
16b0: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
16c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
16d0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
16e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
16f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1700: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1710: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
1720: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
1730: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
1740: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
1750: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1760: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
1770: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
1780: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
1790: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
17a0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
17b0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
17c0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
17d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
17e0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
17f0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
1800: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
1810: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
1820: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
1830: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
1840: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
1850: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
1860: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
1870: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
1880: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
1890: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
18a0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
18b0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
18c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
18d0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
18e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
18f0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
1900: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1910: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
1920: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
1930: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
1940: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
1950: 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61  ls to the lockTa
1960: 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75  ble().** procedu
1970: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
1980: 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73  e handle p..*/.s
1990: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
19a0: 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65  kAllTables(Btree
19b0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
19c0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19d0: 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65    BtLock **ppIte
19e0: 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b  r = &pBt->pLock;
19f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1a00: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1a10: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
1a20: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  t( p->sharable |
1a30: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
1a40: 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65  .  while( *ppIte
1a50: 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  r ){.    BtLock 
1a60: 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72  *pLock = *ppIter
1a70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1a80: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 30  t->pExclusive==0
1a90: 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75 73   || pBt->pExclus
1aa0: 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ive==pLock->pBtr
1ab0: 65 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ee );.    if( pL
1ac0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
1ad0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
1ae0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
1af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1b00: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  ee(pLock);.    }
1b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74  else{.      ppIt
1b20: 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65  er = &pLock->pNe
1b30: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
1b40: 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c 75   if( pBt->pExclu
1b50: 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20 70  sive==p ){.    p
1b60: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d  Bt->pExclusive =
1b70: 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66   0;.  }.}.#endif
1b80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1b90: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1ba0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
1bb0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
1bc0: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
1bd0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1be0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  */../*.** Verify
1bf0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1c00: 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f   holds a mutex o
1c10: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a  n the BtShared.*
1c20: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
1c40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
1c50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
1c60: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
1c70: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
1c80: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
1c90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ca0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
1cb0: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
1cc0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1cd0: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
1ce0: 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66   cursor pCur, if
1cf0: 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   any..*/.static 
1d00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f  void invalidateO
1d10: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43  verflowCache(BtC
1d20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1d40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1d50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1d60: 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
1d70: 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72  );.  pCur->aOver
1d80: 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  flow = 0;.}../*.
1d90: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
1da0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1db0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
1dc0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
1dd0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
1de0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
1df0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
1e00: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
1e10: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1e20: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
1e30: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1e40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
1e70: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
1e80: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1e90: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
1ea0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1eb0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  );.  }.}.#else. 
1ec0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1ed0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1ee0: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
1ef0: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1f00: 6c 6f 77 43 61 63 68 65 28 78 29 0a 23 65 6e 64  lowCache(x).#end
1f10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  if../*.** Save t
1f20: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
1f30: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
1f40: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
1f50: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
1f60: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
1f70: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
1f80: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
1f90: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1fa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fb0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
1fc0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
1fd0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
1fe0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1ff0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2000: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
2010: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
2020: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2030: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2040: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
2050: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
2060: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
2070: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
2080: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
2090: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
20a0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
20b0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
20c0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
20d0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
20e0: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
20f0: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
2100: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
2110: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
2120: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
2130: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
2140: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
2150: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
2160: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
2170: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
2180: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
2190: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
21a0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
21b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
21c0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
21d0: 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b  y){.    void *pK
21e0: 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ey = sqlite3_mal
21f0: 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  loc(pCur->nKey);
2200: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
2210: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2220: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
2230: 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  , 0, pCur->nKey,
2240: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
2250: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2260: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2270: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
2280: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2290: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22a0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
22b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
22d0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
22e0: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50  ssert( !pCur->pP
22f0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  age->intKey || !
2300: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
2310: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2320: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
2330: 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
2340: 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
2350: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2360: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2370: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
2380: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
2390: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
23a0: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
23b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
23c0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
23d0: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
23e0: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
23f0: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
2400: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
2410: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
2420: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
2430: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
2440: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
2450: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2460: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2470: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2480: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
2490: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
24a0: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
24b0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
24c0: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
24d0: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
24e0: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
24f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2500: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2510: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
2520: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
2530: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
2540: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2550: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2560: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2570: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
2580: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
2590: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
25a0: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
25b0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25c0: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
25d0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
25e0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
25f0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
2600: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
2610: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2620: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2640: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
2650: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2660: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2670: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43  atic void clearC
2680: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2690: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26a0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26b0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
26d0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
26e0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
26f0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
2700: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
2720: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
2730: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
2740: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
2750: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
2760: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
2770: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2780: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
2790: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
27a0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
27b0: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
27c0: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
27d0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
27e0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
27f0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
2800: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
2810: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2820: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
2830: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
2840: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
2850: 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  tion()..**.** If
2860: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2870: 6d 65 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20  ment argument - 
2880: 64 6f 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73  doSeek - is fals
2890: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20  e, then instead 
28a0: 6f 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  of .** returning
28b0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
28c0: 74 73 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ts saved positio
28d0: 6e 2c 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73  n, any saved pos
28e0: 69 74 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64  ition is deleted
28f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73  .** and the curs
2900: 6f 72 20 73 74 61 74 65 20 73 65 74 20 74 6f 20  or state set to 
2910: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a  CURSOR_INVALID..
2920: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2930: 72 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61  reeRestoreOrClea
2940: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2950: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2960: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
2970: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2980: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2990: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29a0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
29b0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
29c0: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29d0: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
29e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
29f0: 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 23 69 66 6e  ->skip;.  }.#ifn
2a00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a10: 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 28 20 70  INCRBLOB.  if( p
2a20: 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
2a30: 61 6e 64 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  andle ){.    ret
2a40: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
2a50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
2a60: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a70: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2a80: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a90: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
2aa0: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
2ab0: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
2ac0: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
2ad0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ae0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2af0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
2b00: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2b10: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2b20: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2b30: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2b40: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2b50: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
2b60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
2b70: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43  efine restoreOrC
2b80: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2b90: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
2ba0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
2bb0: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
2bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
2bd0: 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  eeRestoreOrClear
2be0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2bf0: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
2c00: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64  QLITE_OK)..#ifnd
2c10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2c20: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2c30: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
2c40: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
2c50: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
2c60: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
2c70: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2c80: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
2c90: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2ca0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2cb0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
2cc0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2cd0: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
2ce0: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
2cf0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
2d00: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
2d10: 61 70 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c  apPage, iPtrMap,
2d20: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
2d30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d40: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2d50: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
2d60: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
2d70: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2d80: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
2d90: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
2da0: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
2db0: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
2dc0: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
2dd0: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
2de0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2df0: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
2e00: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
2e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
2e20: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
2e30: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
2e40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e50: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
2e60: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
2e70: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
2e80: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
2e90: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
2ea0: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
2eb0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
2ec0: 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72  pgno'..** An err
2ed0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2ee0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
2ef0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
2f00: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
2f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f20: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
2f30: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
2f40: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
2f50: 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50  o parent){.  DbP
2f60: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
2f70: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2f80: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
2f90: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
2fa0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2fb0: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
2fc0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
2fd0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
2fe0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2ff0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
3000: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
3010: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
3020: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
3030: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3040: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
3050: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
3060: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
3070: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
3080: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
3090: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
30a0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
30b0: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
30c0: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
30d0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
30e0: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
30f0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
3100: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
3110: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3120: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
3130: 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  PT;.  }.  iPtrma
3140: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
3150: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
3160: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
3170: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
3180: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
3190: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
31a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
31c0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
31d0: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
31e0: 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  key);.  pPtrmap 
31f0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
3200: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
3210: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
3220: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
3230: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
3240: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
3250: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
3260: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
3270: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
3280: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
3290: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
32a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32b0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
32c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
32d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32e0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
32f0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
3300: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
3310: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
3320: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
3330: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
3340: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
3350: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3360: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
3370: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
3380: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
3390: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
33a0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
33b0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
33c0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
33d0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
33e0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
33f0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
3400: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
3410: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
3420: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
3430: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
3440: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3450: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
3460: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
3470: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
3480: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
3490: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
34a0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
34b0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
34c0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
34d0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
34e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
34f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
3500: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
3510: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
3520: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
3530: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
3540: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
3550: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
3560: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
3570: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
3580: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
3590: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
35a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
35b0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
35c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
35d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
35e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
3600: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
3610: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
3620: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3630: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
3640: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
3650: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
3660: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
3670: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
3680: 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a  FSET(pBt, key);.
3690: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
36a0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
36b0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
36c0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
36d0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
36e0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
36f0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
3700: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
3710: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
3720: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
3730: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
3740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
3750: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
3760: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
3770: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3780: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  AUTOVACUUM */../
3790: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
37a0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
37b0: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
37c0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
37d0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
37e0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
37f0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
3800: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
3810: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3820: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
3830: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3840: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
3850: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
3860: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
3870: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
3880: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
3890: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c  (pPage, iCell) \
38a0: 0a 20 20 28 28 70 50 61 67 65 29 2d 3e 61 44 61  .  ((pPage)->aDa
38b0: 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 28  ta + get2byte(&(
38c0: 70 50 61 67 65 29 2d 3e 61 44 61 74 61 5b 28 70  pPage)->aData[(p
38d0: 50 61 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  Page)->cellOffse
38e0: 74 2b 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 23  t+2*(iCell)])).#
38f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3900: 54 0a 75 38 20 2a 73 71 6c 69 74 65 33 42 74 72  T.u8 *sqlite3Btr
3910: 65 65 46 69 6e 64 43 65 6c 6c 28 4d 65 6d 50 61  eeFindCell(MemPa
3920: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
3930: 43 65 6c 6c 29 7b 0a 20 20 61 73 73 65 72 74 28  Cell){.  assert(
3940: 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61   iCell>=0 );.  a
3950: 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65 74  ssert( iCell<get
3960: 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  2byte(&pPage->aD
3970: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
3980: 66 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65  fset+3]) );.  re
3990: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
39a0: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 23  age, iCell);.}.#
39b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
39c0: 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  s a more complex
39d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
39e0: 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
39f0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
3a00: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
3a10: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
3a20: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
3a30: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
3a40: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
3a50: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
3a60: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
3a70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
3a80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
3aa0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3ab0: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
3ac0: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
3ad0: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
3ae0: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
3af0: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
3b00: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
3b10: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
3b20: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
3b30: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
3b40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
3b50: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
3b60: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
3b70: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
3b80: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
3b90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3ba0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3bb0: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
3bc0: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
3bd0: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
3be0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
3bf0: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
3c00: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
3c10: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
3c20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
3c30: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3c40: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
3c50: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
3c60: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
3c70: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
3c80: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
3c90: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
3cb0: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
3cc0: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
3cd0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
3ce0: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
3cf0: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
3d00: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
3d10: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
3d20: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
3d30: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
3d40: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
3d50: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
3d60: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
3d70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
3d80: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
3d90: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
3da0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
3db0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
3dc0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3de0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
3df0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
3e00: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
3e10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
3e20: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
3e30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  e */.){.  int n;
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
3e60: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
3e70: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
3e80: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
3e90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3ea0: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
3eb0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
3ec0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3ed0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
3ee0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
3ef0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
3f00: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
3f10: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
3f20: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
3f30: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
3f40: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
3f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
3f60: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
3f70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  ;.  if( pPage->h
3f80: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 20  asData ){.    n 
3f90: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
3fa0: 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79 6c  pCell[n], &nPayl
3fb0: 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
3fc0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
3fd0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44  .  }.  pInfo->nD
3fe0: 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  ata = nPayload;.
3ff0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
4000: 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  Key ){.    n += 
4010: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
4020: 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70 49 6e  [n], (u64 *)&pIn
4030: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
4040: 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a 20  se{.    u32 x;. 
4050: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
4060: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26  t32(&pCell[n], &
4070: 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  x);.    pInfo->n
4080: 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61  Key = x;.    nPa
4090: 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a  yload += x;.  }.
40a0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
40b0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
40c0: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
40d0: 20 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   n;.  if( nPaylo
40e0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
40f0: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
4100: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
4110: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
4120: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
4130: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
4140: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
4150: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
4160: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
4170: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
4180: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
4190: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
41a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
41b0: 79 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66  ytes */.    pInf
41c0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79  o->nLocal = nPay
41d0: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
41e0: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
41f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
4200: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66  load + n;.    if
4210: 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20  ( nSize<4 ){.   
4220: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20     nSize = 4;   
4230: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
4240: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
4250: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  /.    }.    pInf
4260: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65  o->nSize = nSize
4270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
4280: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
4290: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
42a0: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
42b0: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
42c0: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
42d0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
42e0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
42f0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
4300: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
4310: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
4320: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
4330: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
4340: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
4350: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
4360: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
4370: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
4380: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
4390: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
43a0: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
43b0: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
43c0: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
43d0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
43e0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
43f0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
4400: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
4410: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
4420: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
4430: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
4440: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
4450: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
4460: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
4470: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
4480: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
4490: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
44a0: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
44b0: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
44c0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
44d0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
44e0: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
44f0: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
4500: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
4510: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
4520: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
4530: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
4540: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
4550: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
4560: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
4570: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
4580: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
4590: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
45a0: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
45b0: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
45c0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
45d0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70  o->nLocal = surp
45e0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
45f0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
4600: 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  cal = minLocal;.
4610: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
4620: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e  >iOverflow = pIn
4630: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a  fo->nLocal + n;.
4640: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
4650: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
4660: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23  low + 4;.  }.}.#
4670: 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c  define parseCell
4680: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
4690: 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65  Info) \.  sqlite
46a0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
46b0: 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64  tr((pPage), find
46c0: 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69  Cell((pPage), (i
46d0: 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29  Cell)), (pInfo))
46e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
46f0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
4700: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
4710: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
4720: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
4730: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
4740: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
4750: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
4760: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
4770: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
4780: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
4790: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
47a0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
47b0: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
47c0: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
47d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
47e0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
47f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
4800: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
4810: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
4820: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
4830: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
4840: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
4850: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
4860: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
4870: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
4880: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
4890: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
48a0: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
48b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
48c0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69  l pointer..*/.#i
48d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
48e0: 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65  tic int cellSize
48f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4900: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43   int iCell){.  C
4910: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
4920: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
4930: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
4940: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
4950: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
4960: 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  .}.#endif.static
4970: 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74 72   int cellSizePtr
4980: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4990: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
49a0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
49b0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
49c0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
49d0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
49e0: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
49f0: 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ze;.}..#ifndef S
4a00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
4a10: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
4a20: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
4a30: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
4a40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
4a50: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
4a60: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
4a70: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
4a80: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
4a90: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
4aa0: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
4ab0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
4ac0: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
4ad0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
4ae0: 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65  Cell){.  if( pCe
4af0: 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  ll ){.    CellIn
4b00: 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 73 71 6c  fo info;.    sql
4b10: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4b20: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
4b30: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
4b40: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
4b50: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
4b60: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
4b70: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
4b80: 29 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f  );.    if( (info
4b90: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
4ba0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
4bb0: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
4bc0: 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  ){.      Pgno ov
4bd0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
4be0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
4bf0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74  low]);.      ret
4c00: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50  urn ptrmapPut(pP
4c10: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
4c20: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
4c30: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
4c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4c50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4c60: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
4c70: 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65  l with index iCe
4c80: 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
4c90: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
4ca0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
4cb0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
4cc0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
4cd0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
4ce0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
4cf0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
4d00: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
4d10: 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a  utOvfl(MemPage *
4d20: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
4d30: 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  ){.  u8 *pCell;.
4d40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4d50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
4d60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
4d70: 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
4d80: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
4d90: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72  age, iCell);.  r
4da0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f  eturn ptrmapPutO
4db0: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
4dc0: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
4dd0: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
4de0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
4df0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
4e00: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
4e10: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
4e20: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
4e30: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
4e40: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
4e50: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
4e60: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
4e70: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
4e80: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
4e90: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
4ea0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
4eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
4ec0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
4ed0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
4ee0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
4ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
4f00: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
4f10: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
4f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
4f30: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
4f40: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cell */.  int ad
4f50: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
4f60: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
4f70: 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  f first byte aft
4f80: 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  er cell pointer 
4f90: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  array */.  int h
4fa0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
4fb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
4fc0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
4fd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
4fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ff0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
5000: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
5010: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
5020: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5030: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
5040: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
5050: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
5060: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
5070: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
5080: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
5090: 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
50b0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
50c0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
50d0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
5100: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
5110: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5120: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
5130: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
5140: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
5150: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
5160: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
5170: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
5180: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
5190: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
51a0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
51b0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
51c0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
51d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
51e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
51f0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
5200: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
5210: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
5220: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
5230: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5240: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
5250: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
5260: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
5270: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
5280: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
5290: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
52a0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
52b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
52c0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
52d0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
52e0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
52f0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
5300: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
5310: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
5320: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
5330: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
5340: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5350: 65 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62  e;.  brk = get2b
5360: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5370: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
5380: 70 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72  p[brk], &data[br
5390: 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  k], usableSize -
53a0: 20 62 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75   brk);.  brk = u
53b0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72  sableSize;.  for
53c0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
53d0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
53e0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
53f0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
5400: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
5410: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
5420: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
5430: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
5440: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
5450: 63 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  c<pPage->pBt->us
5460: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
5470: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
5480: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
5490: 70 63 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d  pc]);.    brk -=
54a0: 20 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70   size;.    memcp
54b0: 79 28 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74  y(&data[brk], &t
54c0: 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  emp[pc], size);.
54d0: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
54e0: 64 72 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  dr, brk);.  }.  
54f0: 61 73 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c  assert( brk>=cel
5500: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20  lOffset+2*nCell 
5510: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
5520: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29  ata[hdr+5], brk)
5530: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
5540: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
5550: 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  2] = 0;.  data[h
5560: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64  dr+7] = 0;.  add
5570: 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32  r = cellOffset+2
5580: 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74  *nCell;.  memset
5590: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c  (&data[addr], 0,
55a0: 20 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 72 65   brk-addr);.  re
55b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
55c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
55d0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
55e0: 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65   space on a page
55f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5600: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
5610: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20  age->aData[] of 
5620: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
5630: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c  f.** the new all
5640: 6f 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75  ocation. Or retu
5650: 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73  rn 0 if there is
5660: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65   not enough free
5670: 0a 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65  .** space on the
5680: 20 70 61 67 65 20 74 6f 20 73 61 74 69 73 66 79   page to satisfy
5690: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
56a0: 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  request..**.** I
56b0: 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
56c0: 69 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72  ins nBytes of fr
56d0: 65 65 20 73 70 61 63 65 20 62 75 74 20 64 6f 65  ee space but doe
56e0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a  s not contain.**
56f0: 20 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69   nBytes of conti
5700: 67 75 6f 75 73 20 66 72 65 65 20 73 70 61 63 65  guous free space
5710: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
5720: 69 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ine automaticall
5730: 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61  y.** calls defra
5740: 67 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20  gementPage() to 
5750: 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20  consolidate all 
5760: 66 72 65 65 20 73 70 61 63 65 20 62 65 66 6f 72  free space befor
5770: 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  e .** allocating
5780: 20 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a   the new chunk..
5790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
57a0: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
57b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
57c0: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64  nByte){.  int ad
57d0: 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69  dr, pc, hdr;.  i
57e0: 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e  nt size;.  int n
57f0: 46 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b  Frag;.  int top;
5800: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
5810: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  int cellOffset;.
5820: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5830: 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61  *data;.  .  data
5840: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
5850: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5860: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
5870: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
5880: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
5890: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
58a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
58b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
58c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
58d0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29  .  if( nByte<4 )
58e0: 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66   nByte = 4;.  if
58f0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e  ( pPage->nFree<n
5900: 42 79 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  Byte || pPage->n
5910: 4f 76 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74  Overflow>0 ) ret
5920: 75 72 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  urn 0;.  pPage->
5930: 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a  nFree -= nByte;.
5940: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
5950: 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72  drOffset;..  nFr
5960: 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ag = data[hdr+7]
5970: 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30  ;.  if( nFrag<60
5980: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63   ){.    /* Searc
5990: 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c  h the freelist l
59a0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f  ooking for a slo
59b0: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
59c0: 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 20 20  satisfy the.    
59d0: 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65 73 74  ** space request
59e0: 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20  . */.    addr = 
59f0: 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65  hdr+1;.    while
5a00: 28 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65  ( (pc = get2byte
5a10: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
5a20: 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d   ){.      size =
5a30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5a40: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
5a50: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
5a60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a  .        if( siz
5a70: 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20  e<nByte+4 ){.   
5a80: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
5a90: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
5aa0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
5ab0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
5ac0: 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d  = nFrag + size -
5ad0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5ae0: 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20    return pc;.   
5af0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5b00: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
5b10: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65  data[pc+2], size
5b20: 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20  -nByte);.       
5b30: 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73     return pc + s
5b40: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
5b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5b60: 20 20 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a       addr = pc;.
5b70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5b80: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
5b90: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
5ba0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
5bb0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
5bc0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
5bd0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20   content area.. 
5be0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
5bf0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
5c00: 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65  ]);.  nCell = ge
5c10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5c20: 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  +3]);.  cellOffs
5c30: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
5c40: 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46  Offset;.  if( nF
5c50: 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f  rag>=60 || cellO
5c60: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20  ffset + 2*nCell 
5c70: 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b  > top - nByte ){
5c80: 0a 20 20 20 20 69 66 28 20 64 65 66 72 61 67 6d  .    if( defragm
5c90: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 20 29  entPage(pPage) )
5ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74   return 0;.    t
5cb0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5cc0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d  ata[hdr+5]);.  }
5cd0: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
5ce0: 0a 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f  .  assert( cellO
5cf0: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20  ffset + 2*nCell 
5d00: 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32  <= top );.  put2
5d10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
5d20: 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72  ], top);.  retur
5d30: 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n top;.}../*.** 
5d40: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
5d50: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
5d60: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
5d70: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
5d80: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
5d90: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
5da0: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
5db0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
5dc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
5dd0: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
5de0: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
5df0: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
5e00: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
5e10: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
5e20: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
5e30: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
5e40: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
5e50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5e60: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
5e70: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61   *pPage, int sta
5e80: 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  rt, int size){. 
5e90: 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69   int addr, pbegi
5ea0: 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e  n, hdr;.  unsign
5eb0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
5ec0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20  pPage->aData;.. 
5ed0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5ee0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
5ef0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5f00: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5f10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5f20: 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d   assert( start>=
5f30: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
5f40: 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f  +6+(pPage->leaf?
5f50: 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74  0:4) );.  assert
5f60: 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29  ( (start + size)
5f70: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
5f80: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
5f90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5fa0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
5fb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5fc0: 20 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73 69   if( size<4 ) si
5fd0: 7a 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66 20  ze = 4;..#ifdef 
5fe0: 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
5ff0: 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72  LETE.  /* Overwr
6000: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
6010: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
6020: 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55  os when the SECU
6030: 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20  RE_DELETE .  ** 
6040: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
6050: 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
6060: 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64  e */.  memset(&d
6070: 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73  ata[start], 0, s
6080: 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
6090: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
60a0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
60b0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
60c0: 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64  eeblocks */.  hd
60d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
60e0: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
60f0: 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  dr + 1;.  while(
6100: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
6110: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
6120: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
6130: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
6140: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
6150: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
6160: 65 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  e-4 );.    asser
6170: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
6180: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  ;.    addr = pbe
6190: 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  gin;.  }.  asser
61a0: 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65  t( pbegin<=pPage
61b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
61c0: 65 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-4 );.  assert(
61d0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
61e0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
61f0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
6200: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
6210: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
6220: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
6230: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6240: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
6250: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
6260: 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  += size;..  /* C
6270: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
6280: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
6290: 20 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e    addr = pPage->
62a0: 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20  hdrOffset + 1;. 
62b0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
62c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
62d0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
62e0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
62f0: 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
6300: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
6310: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
6320: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
6330: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
6340: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
6350: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6360: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
6370: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6380: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
6390: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
63a0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
63b0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
63c0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
63d0: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
63e0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ize);.      asse
63f0: 72 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70  rt( frag<=data[p
6400: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
6410: 37 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61  7] );.      data
6420: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
6430: 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20  t+7] -= frag;.  
6440: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6450: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32  ta[pbegin], get2
6460: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
6470: 5d 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  ]));.      put2b
6480: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6490: 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62  +2], pnext+get2b
64a0: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
64b0: 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20  2])-pbegin);.   
64c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
64d0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
64e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
64f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6500: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
6510: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
6520: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
6530: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
6540: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
6550: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
6560: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
6570: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
6580: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
6590: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
65a0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
65b0: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
65c0: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
65d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
65e0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
65f0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
6600: 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32  r+5], top + get2
6610: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
6620: 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n+2]));.  }.}../
6630: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
6640: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
6650: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
6660: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
6670: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
6680: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
6690: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
66a0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
66b0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
66c0: 69 64 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  id decodeFlags(M
66d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
66e0: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
66f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
6700: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
6710: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
6720: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6730: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
6740: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
6750: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
6760: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6770: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6780: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
6790: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66  age->intKey = (f
67a0: 6c 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49  lagByte & (PTF_I
67b0: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
67c0: 54 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  TA))!=0;.  pPage
67d0: 2d 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c  ->zeroData = (fl
67e0: 61 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52  agByte & PTF_ZER
67f0: 4f 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61  ODATA)!=0;.  pPa
6800: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67  ge->leaf = (flag
6810: 42 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29  Byte & PTF_LEAF)
6820: 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  !=0;.  pPage->ch
6830: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28  ildPtrSize = 4*(
6840: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b  pPage->leaf==0);
6850: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6860: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
6870: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41  yte & PTF_LEAFDA
6880: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
6890: 3e 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20  >leafData = 1;. 
68a0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
68b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
68c0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
68d0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
68e0: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nLeaf;.  }else{.
68f0: 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44      pPage->leafD
6900: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
6910: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
6920: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
6930: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
6940: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
6950: 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  l;.  }.  pPage->
6960: 68 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67  hasData = !(pPag
6970: 65 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28  e->zeroData || (
6980: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20  !pPage->leaf && 
6990: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29  pPage->leafData)
69a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
69b0: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
69c0: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
69d0: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
69e0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61  k..**.** The pPa
69f0: 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d  rent parameter m
6a00: 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72  ust be a pointer
6a10: 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
6a20: 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20  which.** is the 
6a30: 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61  parent of the pa
6a40: 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c  ge being initial
6a50: 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20  ized.  The root 
6a60: 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61  of a.** BTree ha
6a70: 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20  s no parent and 
6a80: 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  so for that page
6a90: 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e  , pParent==NULL.
6aa0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
6ab0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
6ac0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
6ad0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
6ae0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
6af0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
6b00: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
6b10: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
6b20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
6b30: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
6b40: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
6b50: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
6b60: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
6b70: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
6b80: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
6b90: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
6ba0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
6bb0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
6bc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
6bd0: 65 49 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d  eInitPage(.  Mem
6be0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
6bf0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
6c00: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
6c10: 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
6c20: 70 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a  pParent       /*
6c30: 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69   The parent.  Mi
6c40: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
6c50: 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
6c60: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
6c70: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
6c80: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
6c90: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Data[] */.  int 
6ca0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  hdr;           /
6cb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
6cc0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
6cd0: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
6ce0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
6cf0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
6d00: 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61  aData */.  BtSha
6d10: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
6d20: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
6d30: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
6d40: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
6d50: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
6d60: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
6d70: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
6d80: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
6d90: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
6da0: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
6db0: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
6dc0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
6dd0: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
6de0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
6df0: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
6e00: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  page */.  int to
6e10: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
6e20: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
6e30: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
6e40: 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20  rea */..  pBt = 
6e50: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
6e60: 73 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a  sert( pBt!=0 );.
6e70: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
6e80: 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  t==0 || pParent-
6e90: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61  >pBt==pBt );.  a
6ea0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6eb0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6ec0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
6ed0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
6ee0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
6ef0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
6f00: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
6f10: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
6f20: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
6f30: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
6f40: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6f50: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
6f60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
6f70: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
6f80: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  e) );.  if( pPag
6f90: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72  e->pParent!=pPar
6fa0: 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70  ent && (pPage->p
6fb0: 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61  Parent!=0 || pPa
6fc0: 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20  ge->isInit) ){. 
6fd0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
6fe0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76   page should nev
6ff0: 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73  er change unless
7000: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72   the file is cor
7010: 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
7020: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7030: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
7040: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
7050: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7060: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  OK;.  if( pPage-
7070: 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70  >pParent==0 && p
7080: 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20  Parent!=0 ){.   
7090: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
70a0: 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  = pParent;.    s
70b0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
70c0: 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
70d0: 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50  ;.  }.  hdr = pP
70e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
70f0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
7100: 61 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46  aData;.  decodeF
7110: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
7120: 5b 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d  [hdr]);.  pPage-
7130: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
7140: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
7150: 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  t = 0;.  usableS
7160: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
7170: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
7180: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
7190: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
71a0: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
71b0: 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  af;.  top = get2
71c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
71d0: 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  ]);.  pPage->nCe
71e0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
71f0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69  ata[hdr+3]);.  i
7200: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
7210: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
7220: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
7230: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
7240: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
7250: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
7260: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
7270: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7280: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  KPT;.  }.  if( p
7290: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Page->nCell==0 &
72a0: 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20  & pParent!=0 && 
72b0: 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
72c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70   ){.    /* All p
72d0: 61 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61  ages must have a
72e0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
72f0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f  , except for roo
7300: 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  t pages */.    r
7310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7320: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
7330: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
7340: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
7350: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
7360: 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
7370: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
7380: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
7390: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
73a0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
73b0: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77  age->nCell);.  w
73c0: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
73d0: 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65    int next, size
73e0: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61  ;.    if( pc>usa
73f0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
7400: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
7410: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
7420: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7430: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7440: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
7450: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
7460: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
7470: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
7480: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
7490: 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26     if( next>0 &&
74a0: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
74b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
74c0: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
74d0: 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
74e0: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
74f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7500: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
7510: 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a      nFree += siz
7520: 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74  e;.    pc = next
7530: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
7540: 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20  Free = nFree;.  
7550: 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c  if( nFree>=usabl
7560: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eSize ){.    /* 
7570: 46 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f  Free space canno
7580: 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70  t exceed total p
7590: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  age size */.    
75a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
75b0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
75c0: 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ..  pPage->isIni
75d0: 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
75e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
75f0: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
7600: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
7610: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
7620: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
7630: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
7640: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7650: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
7660: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
7670: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
7680: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
7690: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
76a0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
76b0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
76c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
76d0: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
76e0: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
76f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
7700: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
7710: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
7720: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
7730: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
7740: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
7750: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
7760: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
7770: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7780: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
7790: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
77a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
77b0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
77c0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
77d0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
77e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
77f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7800: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   );.  memset(&da
7810: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
7820: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
7830: 72 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20  r);.  data[hdr] 
7840: 3d 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  = flags;.  first
7850: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
7860: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
7870: 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ==0);.  memset(&
7880: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
7890: 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
78a0: 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
78b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
78c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
78d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
78e0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
78f0: 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65  ze - first;.  de
7900: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
7910: 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
7920: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64  ->hdrOffset = hd
7930: 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  r;.  pPage->cell
7940: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
7950: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
7960: 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ow = 0;.  pPage-
7970: 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
7980: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
7990: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
79a0: 69 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 1;.}../*.**
79b0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
79c0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
79d0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
79e0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
79f0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
7a00: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
7a10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
7a20: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
7a30: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
7a40: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
7a50: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
7a60: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
7a70: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
7a80: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
7a90: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
7aa0: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
7ab0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
7ac0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
7ad0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
7ae0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
7af0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
7b00: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7b10: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
7b20: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
7b30: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
7b40: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
7b50: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
7b60: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
7b70: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
7b80: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
7b90: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7ba0: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
7bb0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
7bc0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
7bd0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
7be0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7bf0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
7c00: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
7c10: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
7c20: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
7c30: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
7c40: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
7c50: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
7c60: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
7c70: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
7c80: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
7c90: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
7ca0: 61 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  age;.  DbPage *p
7cb0: 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
7cc0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7cd0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7ce0: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
7cf0: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
7d00: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
7d10: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
7d20: 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  bPage, noContent
7d30: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
7d40: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
7d50: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
7d60: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
7d70: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
7d80: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
7d90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7da0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
7db0: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
7dc0: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
7dd0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
7de0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
7df0: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
7e00: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
7e10: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
7e20: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61  .  *ppPage = pPa
7e30: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
7e40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7e50: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
7e60: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
7e70: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
7e80: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
7e90: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
7ea0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
7eb0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
7ec0: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
7ed0: 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61  BtreeGetPage() a
7ee0: 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nd sqlite3BtreeI
7ef0: 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  nitPage()..*/.st
7f00: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
7f10: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
7f20: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
7f30: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
7f40: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
7f50: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
7f60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
7f70: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
7f80: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
7f90: 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
7fa0: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
7fb0: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d  er here */.  Mem
7fc0: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
7fd0: 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74    /* Parent of t
7fe0: 68 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  he page */.){.  
7ff0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
8000: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8010: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
8020: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
8030: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8040: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8050: 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d  KPT; .  }.  rc =
8060: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8070: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
8080: 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  ppPage, 0);.  if
8090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
80a0: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
80b0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Init==0 ){.    r
80c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
80d0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
80e0: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
80f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8100: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
8110: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
8120: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
8130: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
8140: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
8150: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
8160: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
8170: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
8180: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
8190: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
81a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
81b0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
81c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
81d0: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
81e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
81f0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
8200: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
8210: 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73  pPage );.    ass
8220: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
8230: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
8240: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
8250: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
8260: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8270: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8280: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8290: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
82a0: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
82b0: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
82c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
82d0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
82e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
82f0: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  nt for a page.**
8300: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
8310: 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66  We need to unref
8320: 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
8330: 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a  nter when that.*
8340: 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74  * happens..*/.st
8350: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65  atic void pageDe
8360: 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65 20  structor(DbPage 
8370: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
8380: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
8390: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
83a0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
83b0: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
83c0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
83d0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
83e0: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
83f0: 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
8400: 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  t==0 || sqlite3_
8410: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8420: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8430: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50  .  if( pPage->pP
8440: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d  arent ){.    Mem
8450: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20  Page *pParent = 
8460: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
8470: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
8480: 65 6e 74 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d  ent->pBt==pPage-
8490: 3e 70 42 74 20 29 3b 0a 20 20 20 20 70 50 61 67  >pBt );.    pPag
84a0: 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
84b0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
84c0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  pParent);.  }.  
84d0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
84e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  0;.}../*.** Duri
84f0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
8500: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
8510: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
8520: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
8530: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
8540: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
8550: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
8560: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
8570: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
8580: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
8590: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
85a0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
85b0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
85c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
85d0: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
85e0: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
85f0: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
8600: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
8610: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
8620: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
8630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8640: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
8650: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
8660: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
8670: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
8680: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
8690: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
86a0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
86b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
86c0: 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  a(pData);.  if( 
86d0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
86e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
86f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8700: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8710: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
8720: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
8730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
8740: 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
8750: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
8760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
8770: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
8780: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
8790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
87a0: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
87b0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
87c0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 29 7b 0a   *pArg, int n){.
87d0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
87e0: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
87f0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
8800: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
8810: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8820: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
8830: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
8840: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
8850: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
8860: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
8870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
8880: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
8890: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
88a0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
88b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
88c0: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
88d0: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e  e is NULL.** a n
88e0: 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ew database with
88f0: 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69   a random name i
8900: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73  s created.  This
8910: 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a   randomly named.
8920: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
8930: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
8940: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
8950: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
8960: 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  led..** If zFile
8970: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
8980: 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
8990: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
89a0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
89b0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
89c0: 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
89d0: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
89e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
89f0: 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  eeOpen(.  const 
8a00: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
8a10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8a20: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
8a30: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
8a40: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
8a50: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
8a60: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
8a70: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
8a80: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
8a90: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
8aa0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
8ab0: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
8ac0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
8ad0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
8ae0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
8af0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
8b00: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
8b10: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
8b20: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
8b30: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
8b40: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
8b50: 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54  *pVfs;      /* T
8b60: 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  he VFS to use fo
8b70: 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  r this btree */.
8b80: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
8b90: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 68 61  = 0;      /* Sha
8ba0: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
8bb0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
8bc0: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
8bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
8be0: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
8bf0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8c00: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73  E_OK;.  int nRes
8c10: 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  erve;.  unsigned
8c20: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
8c30: 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  100];..  /* Set 
8c40: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
8c50: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
8c60: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
8c70: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
8c80: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
8c90: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
8ca0: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
8cb0: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
8cc0: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
8cd0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
8ce0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
8cf0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
8d00: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
8d10: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
8d20: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
8d30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
8d40: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
8d50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8d60: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
8d70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8d80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
8d90: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
8da0: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
8db0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
8dc0: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
8dd0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
8de0: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
8df0: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
8e00: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
8e10: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8e20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8e30: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
8e40: 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e  ;..  pVfs = db->
8e50: 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69  pVfs;.  p = sqli
8e60: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
8e70: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
8e80: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
8e90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8ea0: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
8eb0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
8ec0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
8ed0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8ee0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
8ef0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
8f00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8f10: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
8f20: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
8f30: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
8f40: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
8f50: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
8f60: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
8f70: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
8f80: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
8f90: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
8fa0: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 50  (flags & BTREE_P
8fb0: 52 49 56 41 54 45 29 3d 3d 30 0a 20 20 20 26 26  RIVATE)==0.   &&
8fc0: 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26   isMemdb==0.   &
8fd0: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
8fe0: 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20  QLITE_Vtab)==0. 
8ff0: 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26    && zFilename &
9000: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20  & zFilename[0]. 
9010: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
9020: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e  te3SharedCacheEn
9030: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69  abled ){.      i
9040: 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
9050: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
9060: 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
9070: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
9080: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9090: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  e3_malloc(nFullP
90a0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
90b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
90c0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
90d0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
90e0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 20  1;.      if( db 
90f0: 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66  ){.        db->f
9100: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
9110: 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20  haredCache;.    
9120: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 7a    }.      if( !z
9130: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
9140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9150: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
9160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9170: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
9180: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
9190: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
91a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
91b0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
91c0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
91d0: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
91e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
91f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
9200: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
9210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9220: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
9230: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
9240: 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68 61 72  (pBt=sqlite3Shar
9250: 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70 42 74  edCacheList; pBt
9260: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
9270: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9280: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
9290: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
92a0: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
92b0: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
92c0: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
92d0: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
92e0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
92f0: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
9300: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
9310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
9320: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
9330: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
9340: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
9350: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9360: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9370: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9380: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
9390: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
93a0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
93b0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
93c0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
93d0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
93e0: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
93f0: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
9400: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
9410: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
9420: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
9430: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
9440: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
9450: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
9460: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
9470: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
9480: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
9490: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
94a0: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
94b0: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
94c0: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
94d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
94e0: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
94f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
9500: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
9510: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
9520: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
9530: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
9540: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
9550: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
9560: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
9570: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
9580: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
9590: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
95a0: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
95b0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
95c0: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
95d0: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
95e0: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
95f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9600: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
9610: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
9620: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9630: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
9640: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
9650: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9660: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
9670: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9680: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
9690: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
96a0: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
96b0: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
96c0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
96d0: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
96e0: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
96f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9700: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
9710: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
9720: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
9730: 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20 3d 20  busyHdr.xFunc = 
9740: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f  sqlite3BtreeInvo
9750: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  keBusyHandler;. 
9760: 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72 2e     pBt->busyHdr.
9770: 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20 20 20  pArg = pBt;.    
9780: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9790: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
97a0: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
97b0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
97d0: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
97e0: 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20  , vfsFlags);.   
97f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9800: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9810: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
9820: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
9830: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
9840: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
9850: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
9860: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9870: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
9880: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
9890: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
98a0: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
98b0: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
98c0: 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64 72 29  , &pBt->busyHdr)
98d0: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
98e0: 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74  Bt;.  .    sqlit
98f0: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
9900: 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ctor(pBt->pPager
9910: 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72  , pageDestructor
9920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
9930: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70  gerSetReiniter(p
9940: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
9950: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74  Reinit);.    pBt
9960: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
9970: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
9980: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
9990: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
99a0: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
99b0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
99c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
99d0: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
99e0: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
99f0: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
9a00: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
9a10: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
9a20: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
9a30: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
9a40: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
9a50: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
9a60: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
9a70: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ze = 0;.      sq
9a80: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9a90: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
9aa0: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
9ab0: 65 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d  e);.      pBt->m
9ac0: 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 36 34  axEmbedFrac = 64
9ad0: 3b 20 20 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20  ;   /* 25% */.  
9ae0: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65      pBt->minEmbe
9af0: 64 46 72 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a  dFrac = 32;   /*
9b00: 20 31 32 2e 35 25 20 2a 2f 0a 20 20 20 20 20 20   12.5% */.      
9b10: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
9b20: 20 3d 20 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e   = 32;    /* 12.
9b30: 35 25 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  5% */.#ifndef SQ
9b40: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9b50: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
9b60: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
9b70: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
9b80: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
9b90: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
9ba0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
9bb0: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
9bc0: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
9bd0: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
9be0: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
9bf0: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
9c00: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
9c10: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
9c20: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
9c30: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
9c40: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
9c50: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
9c60: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
9c70: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
9c80: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
9c90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
9ca0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
9cb0: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
9cc0: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
9cd0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
9ce0: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
9cf0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
9d00: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
9d10: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
9d20: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
9d30: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
9d40: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
9d50: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9d60: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
9d70: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
9d80: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
9d90: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
9da0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
9db0: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
9dc0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d        pBt->maxEm
9dd0: 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65 61  bedFrac = zDbHea
9de0: 64 65 72 5b 32 31 5d 3b 0a 20 20 20 20 20 20 70  der[21];.      p
9df0: 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63  Bt->minEmbedFrac
9e00: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 32 5d   = zDbHeader[22]
9e10: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9e20: 4c 65 61 66 46 72 61 63 20 3d 20 7a 44 62 48 65  LeafFrac = zDbHe
9e30: 61 64 65 72 5b 32 33 5d 3b 0a 20 20 20 20 20 20  ader[23];.      
9e40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
9e50: 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
9e60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9e70: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
9e80: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
9e90: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
9ea0: 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
9eb0: 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
9ec0: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
9ed0: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
9ee0: 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
9ef0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
9f00: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
9f10: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
9f20: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
9f30: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
9f40: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
9f50: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
9f60: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
9f70: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  geSize */.    sq
9f80: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9f90: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
9fa0: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
9fb0: 65 29 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66  e);.   .#if !def
9fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9fd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9fe0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9ff0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
a000: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
a010: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
a020: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
a030: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
a040: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
a050: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
a060: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
a070: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
a080: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
a090: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
a0a0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
a0b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
a0c0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
a0d0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
a0e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
a0f0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
a100: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
a110: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
a120: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
a130: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
a140: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
a150: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
a160: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a170: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
a180: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
a190: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
a1a0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
a1b0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
a1c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a1d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a1e0: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
a1f0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
a200: 78 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72  xt = sqlite3Shar
a210: 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20  edCacheList;.   
a220: 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64     sqlite3Shared
a230: 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 3b  CacheList = pBt;
a240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
a250: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
a260: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
a270: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
a280: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a290: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a2a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a2b0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
a2c0: 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
a2d0: 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
a2e0: 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
a2f0: 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
a300: 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
a310: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
a320: 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
a330: 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
a340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
a350: 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
a360: 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
a370: 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
a380: 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
a390: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
a3a0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a3b0: 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
a3c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a3d0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
a3e0: 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
a3f0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
a400: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
a410: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
a420: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
a430: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
a440: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
a450: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
a460: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
a470: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
a480: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
a490: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
a4a0: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
a4b0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
a4c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a4d0: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
a4e0: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
a4f0: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
a500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
a510: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
a520: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a530: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
a540: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
a550: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
a560: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
a570: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
a580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a590: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
a5a0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
a5b0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
a5c0: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
a5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
a5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a5f0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a600: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
a610: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
a620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a630: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
a640: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
a650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a660: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
a670: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
a680: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a690: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
a6a0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
a6b0: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
a6c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a6d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
a6e0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
a6f0: 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
a700: 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
a710: 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
a720: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
a730: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
a740: 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
a750: 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
a760: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
a770: 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
a780: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
a790: 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
a7a0: 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
a7b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a7c0: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
a7d0: 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
a7e0: 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
a7f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a800: 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65  D_CACHE.  sqlite
a810: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
a820: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ;.  BtShared *pL
a830: 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
a840: 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
a850: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a860: 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
a870: 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65  tex) );.  pMaste
a880: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  r = sqlite3_mute
a890: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
a8a0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
a8b0: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
a8c0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
a8d0: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
a8e0: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
a8f0: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
a900: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
a910: 61 63 68 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b  acheList==pBt ){
a920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 68  .      sqlite3Sh
a930: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
a940: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
a950: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
a960: 73 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72  st = sqlite3Shar
a970: 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20  edCacheList;.   
a980: 20 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20     while( pList 
a990: 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
a9a0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
a9b0: 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
a9c0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a9d0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
a9e0: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
a9f0: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
aa00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aa10: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
aa20: 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
aa30: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
aa40: 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
aa50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
aa60: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
aa70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
aa80: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
aa90: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
aaa0: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
aab0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
aac0: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
aad0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
aae0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
aaf0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
ab00: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
ab10: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
ab20: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ab30: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
ab40: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
ab50: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
ab60: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
ab70: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
ab80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ab90: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
aba0: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
abb0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
abc0: 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
abd0: 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
abe0: 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
abf0: 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
ac00: 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
ac10: 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
ac20: 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
ac30: 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
ac40: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
ac50: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
ac60: 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
ac70: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
ac80: 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
ac90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
aca0: 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
acb0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
acc0: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
acd0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
ace0: 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
acf0: 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
ad00: 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
ad10: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
ad20: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
ad30: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
ad40: 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
ad50: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
ad60: 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
ad70: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
ad80: 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
ad90: 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
ada0: 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
adb0: 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
adc0: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
add0: 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
ade0: 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
adf0: 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
ae00: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
ae10: 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
ae20: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
ae30: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
ae40: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
ae50: 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
ae60: 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
ae70: 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
ae80: 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
ae90: 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
aea0: 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
aeb0: 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
aec0: 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
aed0: 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
aee0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
aef0: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
af00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
af10: 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
af20: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
af30: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
af40: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
af50: 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
af60: 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
af70: 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
af80: 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
af90: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
afa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
afb0: 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  e(pBt->pSchema);
afc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
afd0: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
afe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aff0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
b000: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
b010: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
b020: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
b030: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
b040: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
b050: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
b060: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
b070: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
b080: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
b090: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
b0a0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
b0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b0c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
b0d0: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
b0e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b0f0: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
b100: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
b110: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
b120: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
b130: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
b140: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
b150: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b160: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b170: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b180: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
b190: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
b1a0: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
b1b0: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
b1c0: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
b1d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b1e0: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
b1f0: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
b200: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
b210: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
b220: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b230: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
b240: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
b250: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
b260: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
b270: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
b280: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
b290: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
b2a0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
b2b0: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
b2c0: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
b2d0: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
b2e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
b2f0: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
b300: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b310: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
b320: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
b330: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
b340: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
b350: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
b360: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
b370: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
b380: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
b390: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
b3a0: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
b3b0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b3c0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b3d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b3e0: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
b3f0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
b400: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b410: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
b420: 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
b430: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
b440: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b450: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b460: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b470: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b480: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
b490: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
b4a0: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
b4b0: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
b4c0: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
b4d0: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
b4e0: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
b4f0: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
b500: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
b510: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
b520: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
b530: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
b540: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
b550: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
b560: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b570: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
b580: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
b590: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
b5a0: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
b5b0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b5c0: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
b5d0: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
b5e0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
b5f0: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
b600: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
b610: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
b620: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
b630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b640: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
b650: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b660: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
b670: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
b680: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
b690: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b6a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
b6b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b6c0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
b6d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
b6e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b6f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
b700: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
b710: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
b720: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
b730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b740: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
b750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
b760: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b770: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
b780: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
b790: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
b7a0: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
b7b0: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
b7c0: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
b7d0: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
b7e0: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
b7f0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
b800: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
b810: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
b820: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
b830: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
b840: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b850: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
b860: 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
b870: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
b880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
b890: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
b8a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
b8b0: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
b8c0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
b8d0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b8e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b8f0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b900: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
b910: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
b920: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b930: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
b940: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
b950: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
b960: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
b970: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
b980: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
b990: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
b9a0: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
b9b0: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
b9c0: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
b9d0: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
b9e0: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
b9f0: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
ba00: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
ba10: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
ba20: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
ba30: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
ba40: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
ba50: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
ba60: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
ba70: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
ba80: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
ba90: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
baa0: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
bab0: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
bac0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
bad0: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
bae0: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
baf0: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
bb00: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
bb10: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
bb20: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
bb30: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
bb40: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
bb50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
bb60: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
bb70: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
bb80: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
bb90: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
bba0: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
bbb0: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
bbc0: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
bbd0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bbe0: 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
bbf0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
bc00: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bc10: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
bc20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
bc30: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
bc40: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
bc50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc60: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
bc70: 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
bc80: 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
bc90: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
bca0: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
bcb0: 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61  ze;.  }.  if( pa
bcc0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bcd0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
bce0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
bcf0: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
bd00: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
bd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
bd20: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
bd30: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
bd40: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
bd50: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
bd60: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
bd70: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
bd80: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
bd90: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
bda0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
bdb0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
bdc0: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
bdd0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
bde0: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
bdf0: 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ve;.  sqlite3Btr
be00: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
be10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
be20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
be30: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
be40: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
be50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
be60: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
be70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
be80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
be90: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
bea0: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
beb0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
bec0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
bed0: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
bee0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
bef0: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
bf00: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
bf10: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
bf20: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
bf30: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
bf40: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
bf50: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
bf60: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
bf70: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
bf80: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
bf90: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
bfa0: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
bfb0: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
bfc0: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
bfd0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
bfe0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
bff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
c000: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
c010: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
c020: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
c030: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c040: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
c050: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
c060: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
c070: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
c080: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c090: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c0a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
c0b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
c0c0: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
c0d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c0e0: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
c0f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c100: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
c110: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
c120: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
c130: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
c140: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
c150: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
c160: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
c170: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
c180: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
c190: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
c1a0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
c1b0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
c1c0: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
c1d0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
c1e0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c1f0: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
c200: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c210: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
c220: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
c230: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
c240: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c250: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
c260: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
c270: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
c280: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
c290: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
c2a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c2b0: 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d  av = (autoVacuum
c2c0: 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ?1:0);..  sqlite
c2d0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c2e0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
c2f0: 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d  izeFixed && av!=
c300: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c310: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
c320: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c330: 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
c340: 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a  utoVacuum = av;.
c350: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
c360: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c370: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c380: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c390: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c3a0: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
c3b0: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
c3c0: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
c3d0: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
c3e0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
c3f0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
c400: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
c410: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
c420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
c440: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
c450: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
c460: 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
c470: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c480: 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
c490: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
c4a0: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c4b0: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
c4c0: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
c4d0: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
c4e0: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
c4f0: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
c500: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
c510: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c520: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c530: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
c540: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
c550: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
c560: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c570: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
c580: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
c590: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
c5a0: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
c5b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c5c0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
c5d0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
c5e0: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
c5f0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
c600: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
c610: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
c620: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
c630: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
c640: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
c650: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
c660: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
c670: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
c680: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
c690: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
c6a0: 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
c6b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
c6c0: 20 72 63 2c 20 70 61 67 65 53 69 7a 65 3b 0a 20   rc, pageSize;. 
c6d0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
c6e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c6f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c700: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c710: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
c720: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c730: 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  _OK;.  rc = sqli
c740: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
c750: 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
c760: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
c770: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
c780: 6e 20 72 63 3b 0a 20 20 0a 0a 20 20 2f 2a 20 44  n rc;.  ..  /* D
c790: 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
c7a0: 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
c7b0: 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
c7c0: 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
c7d0: 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
c7e0: 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
c7f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
c800: 44 42 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  DB;.  if( sqlite
c810: 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
c820: 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30 20 29  pBt->pPager)>0 )
c830: 7b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  {.    u8 *page1 
c840: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
c850: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
c860: 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
c870: 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
c880: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
c890: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
c8a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
c8b0: 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
c8c0: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
c8d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
c8e0: 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
c8f0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
c900: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
c910: 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
c920: 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
c930: 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
c940: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
c950: 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
c960: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
c970: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
c980: 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
c990: 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
c9a0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
c9b0: 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
c9c0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
c9d0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
c9e0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
c9f0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
ca00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
ca10: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
ca20: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
ca30: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
ca40: 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
ca50: 66 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  f( pBt->usableSi
ca60: 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20  ze<500 ){.      
ca70: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
ca80: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
ca90: 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46    pBt->maxEmbedF
caa0: 72 61 63 20 3d 20 70 61 67 65 31 5b 32 31 5d 3b  rac = page1[21];
cab0: 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45 6d 62  .    pBt->minEmb
cac0: 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32  edFrac = page1[2
cad0: 32 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e  2];.    pBt->min
cae0: 4c 65 61 66 46 72 61 63 20 3d 20 70 61 67 65 31  LeafFrac = page1
caf0: 5b 32 33 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51  [23];.#ifndef SQ
cb00: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cb10: 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
cb20: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
cb30: 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
cb40: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
cb50: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
cb60: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
cb70: 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
cb80: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
cb90: 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
cba0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
cbb0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
cbc0: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
cbd0: 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
cbe0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
cbf0: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
cc00: 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
cc10: 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
cc20: 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
cc30: 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
cc40: 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
cc50: 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
cc60: 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
cc70: 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
cc80: 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
cc90: 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
cca0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
ccb0: 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
ccc0: 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
ccd0: 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
cce0: 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
ccf0: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
cd00: 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
cd10: 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
cd20: 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
cd30: 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
cd40: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
cd50: 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
cd60: 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
cd70: 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
cd80: 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
cd90: 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
cda0: 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
cdb0: 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
cdc0: 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
cdd0: 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
cde0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
cdf0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
ce00: 2d 31 32 29 2a 70 42 74 2d 3e 6d 61 78 45 6d 62  -12)*pBt->maxEmb
ce10: 65 64 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b  edFrac/255 - 23;
ce20: 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
ce30: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
ce40: 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e  ize-12)*pBt->min
ce50: 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d 20  EmbedFrac/255 - 
ce60: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
ce70: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
ce80: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
ce90: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
cea0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
ceb0: 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61  *pBt->minLeafFra
cec0: 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 69 66  c/255 - 23;.  if
ced0: 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e  ( pBt->minLocal>
cee0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 7c 7c  pBt->maxLocal ||
cef0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3c 30   pBt->maxLocal<0
cf00: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
cf10: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
cf20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
cf30: 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
cf40: 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
cf50: 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
cf60: 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
cf70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cf80: 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
cf90: 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
cfa0: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
cfb0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
cfc0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cfd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
cfe0: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
cff0: 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65  lockBtree() exce
d000: 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20  pt that it also 
d010: 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62  invokes the.** b
d020: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
d030: 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f  there is lock co
d040: 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ntention..*/.sta
d050: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
d060: 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65  eWithRetry(Btree
d070: 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72   *pRef){.  int r
d080: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
d090: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d0a0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
d0b0: 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20  (pRef) );.  if( 
d0c0: 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  pRef->inTrans==T
d0d0: 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
d0e0: 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f   u8 inTransactio
d0f0: 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69  n = pRef->pBt->i
d100: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
d110: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
d120: 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d  (pRef);.    rc =
d130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
d140: 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29  inTrans(pRef, 0)
d150: 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d  ;.    pRef->pBt-
d160: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
d170: 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a   inTransaction;.
d180: 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e      pRef->inTran
d190: 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
d1a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d1b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
d1c0: 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73  Ref->pBt->nTrans
d1d0: 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  action--;.    }.
d1e0: 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69      btreeIntegri
d1f0: 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20  ty(pRef);.  }.  
d200: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20  return rc;.}.   
d210: 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74      ../*.** If t
d220: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
d230: 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
d240: 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
d250: 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
d260: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
d270: 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
d280: 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
d290: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
d2a0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
d2b0: 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
d2c0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
d2d0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
d2e0: 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
d2f0: 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
d300: 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
d310: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
d320: 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
d330: 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73  ng cursors, this
d340: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
d350: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
d360: 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
d370: 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
d380: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
d390: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
d3a0: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
d3b0: 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
d3c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
d3d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d3e0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d3f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
d400: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
d410: 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
d420: 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  & pBt->pCursor==
d430: 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  0 && pBt->pPage1
d440: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  !=0 ){.    if( s
d450: 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
d460: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
d470: 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=1 ){.      if(
d480: 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
d490: 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
d4a0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
d4b0: 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
d4c0: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61          pPage->a
d4d0: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
d4e0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
d4f0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
d500: 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
d510: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50   pBt;.        pP
d520: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
d530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
d540: 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
d550: 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
d560: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
d570: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
d580: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
d590: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
d5a0: 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
d5b0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
d5c0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a  rst page of the.
d5d0: 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
d5e0: 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
d5f0: 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
d600: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d610: 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
d620: 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
d630: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
d640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d650: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d660: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
d670: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
d680: 2d 3e 70 50 61 67 65 72 29 3e 30 20 29 20 72 65  ->pPager)>0 ) re
d690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d6a0: 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
d6b0: 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
d6c0: 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
d6d0: 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
d6e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
d6f0: 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
d700: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
d710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
d720: 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
d730: 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
d740: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
d750: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
d760: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
d770: 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  16 );.  put2byte
d780: 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d  (&data[16], pBt-
d790: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
d7a0: 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
d7b0: 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[19] = 1;.  da
d7c0: 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61  ta[20] = pBt->pa
d7d0: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
d7e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
d7f0: 5b 32 31 5d 20 3d 20 70 42 74 2d 3e 6d 61 78 45  [21] = pBt->maxE
d800: 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
d810: 5b 32 32 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 45  [22] = pBt->minE
d820: 6d 62 65 64 46 72 61 63 3b 0a 20 20 64 61 74 61  mbedFrac;.  data
d830: 5b 32 33 5d 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  [23] = pBt->minL
d840: 65 61 66 46 72 61 63 3b 0a 20 20 6d 65 6d 73 65  eafFrac;.  memse
d850: 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
d860: 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
d870: 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
d880: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
d890: 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
d8a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
d8b0: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
d8c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d8d0: 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
d8e0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
d8f0: 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
d900: 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
d910: 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
d920: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
d930: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
d940: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
d950: 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
d960: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
d970: 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
d980: 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
d990: 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
d9a0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
d9b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d9c0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
d9d0: 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
d9e0: 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
d9f0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
da00: 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
da10: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
da20: 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
da30: 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
da40: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
da50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
da60: 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
da70: 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
da80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
da90: 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
daa0: 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
dab0: 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
dac0: 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
dad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
dae0: 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
daf0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
db00: 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
db10: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
db20: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
db30: 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
db40: 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
db50: 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
db60: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
db70: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
db80: 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
db90: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
dba0: 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
dbb0: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
dbc0: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
dbd0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
dbe0: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
dbf0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
dc00: 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
dc10: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
dc20: 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
dc30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
dc40: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
dc50: 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
dc60: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
dc70: 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
dc80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
dc90: 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
dca0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
dcb0: 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
dcc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
dcd0: 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
dce0: 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
dcf0: 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
dd00: 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
dd10: 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
dd20: 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
dd30: 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
dd40: 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
dd50: 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
dd60: 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
dd70: 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
dd80: 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
dd90: 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
dda0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
ddb0: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
ddc0: 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
ddd0: 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
dde0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
ddf0: 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
de00: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
de10: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
de20: 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
de30: 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
de40: 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
de50: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
de60: 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
de70: 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
de80: 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
de90: 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
dea0: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
deb0: 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
dec0: 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
ded0: 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
dee0: 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
def0: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
df00: 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
df10: 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
df20: 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
df30: 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
df40: 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
df50: 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
df60: 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
df70: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
df80: 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
df90: 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
dfa0: 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
dfb0: 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
dfc0: 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
dfd0: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
dfe0: 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
dff0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
e000: 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
e010: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
e020: 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
e030: 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
e040: 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
e050: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e060: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
e070: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
e080: 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  lag){.  BtShared
e090: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
e0a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e0b0: 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
e0c0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
e0d0: 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
e0e0: 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
e0f0: 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
e100: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
e110: 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
e120: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
e130: 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
e140: 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
e150: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
e160: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
e170: 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
e180: 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
e190: 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
e1a0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
e1b0: 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
e1c0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
e1d0: 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
e1e0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
e1f0: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
e200: 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
e210: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
e220: 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
e230: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
e240: 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
e250: 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
e260: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e270: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
e280: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e290: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e2a0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
e2b0: 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
e2c0: 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
e2d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
e2e0: 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
e2f0: 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
e300: 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
e310: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e320: 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
e330: 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
e340: 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  E_BUSY..  */.  i
e350: 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
e360: 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
e370: 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  TE && wrflag ){.
e380: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e390: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  BUSY;.    goto t
e3a0: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e3b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e3c0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e3d0: 45 0a 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31  E.  if( wrflag>1
e3e0: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
e3f0: 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
e400: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
e410: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
e420: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
e430: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
e440: 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
e450: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
e460: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  USY;.        got
e470: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
e480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e490: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a  .#endif..  do {.
e4a0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
e4b0: 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge1==0 ){.      
e4c0: 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
e4d0: 42 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Bt);.    }..    
e4e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e4f0: 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
e500: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
e510: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
e520: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
e530: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
e540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
e550: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
e560: 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
e570: 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
e580: 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >1);.        if(
e590: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e5a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
e5b0: 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
e5c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e5d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
e5e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e5f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
e600: 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69   wrflag ) pBt->i
e610: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
e620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  else{.      unlo
e630: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
e640: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
e650: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
e660: 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
e670: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
e680: 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
e690: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e6a0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
e6b0: 65 72 28 70 42 74 2c 20 30 29 20 29 3b 0a 0a 20  er(pBt, 0) );.. 
e6c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e6d0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
e6e0: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
e6f0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
e700: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
e710: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  +;.    }.    p->
e720: 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
e730: 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
e740: 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
e750: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
e760: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
e770: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
e780: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
e790: 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
e7a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e7b0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e7c0: 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
e7d0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >1 ){.      asse
e7e0: 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75  rt( !pBt->pExclu
e7f0: 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42  sive );.      pB
e800: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20  t->pExclusive = 
e810: 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  p;.    }.#endif.
e820: 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
e830: 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  n:.  btreeIntegr
e840: 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
e850: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
e860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e880: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
e890: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
e8a0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
e8b0: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
e8c0: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
e8d0: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
e8e0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
e8f0: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
e900: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
e910: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
e920: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
e930: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
e940: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
e950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
e960: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
e970: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
e980: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
e9b0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
e9c0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
e9f0: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
ea00: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ea30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
ea40: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
ea50: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
ea60: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
ea70: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
ea80: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
ea90: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
eaa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
eab0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
eac0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
ead0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
eae0: 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
eaf0: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
eb00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
eb10: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
eb20: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
eb30: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
eb40: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
eb50: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
eb60: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
eb70: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
eb80: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
eb90: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
eba0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
ebb0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
ebc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ebd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
ebe0: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
ebf0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
ec00: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
ec10: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
ec20: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
ec30: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
ec40: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
ec50: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
ec60: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
ec70: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
ec80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
ec90: 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
eca0: 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20  trmaps_out;.    
ecb0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
ecc0: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
ecd0: 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
ece0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
ecf0: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
ed00: 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
ed10: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
ed20: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
ed30: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
ed40: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f  pgno);.  }..set_
ed50: 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
ed60: 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
ed70: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
ed80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ed90: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
eda0: 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68   on pPage, which
edb0: 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
edc0: 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  o be a btree pag
edd0: 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c  e, not an overfl
ede0: 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61  ow.** page, is a
edf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
ee00: 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74   iFrom. Modify t
ee10: 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74  his pointer so t
ee20: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
ee30: 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74  .** iTo. Paramet
ee40: 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
ee50: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
ee60: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64  ointer to be mod
ee70: 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f  ified, as .** fo
ee80: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
ee90: 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
eea0: 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
eeb0: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
eec0: 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
eed0: 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
eee0: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
eef0: 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
ef00: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
ef10: 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
ef20: 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
ef30: 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
ef40: 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ef60: 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
ef70: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
ef80: 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
ef90: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
efa0: 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
efb0: 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
efc0: 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
efd0: 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
efe0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
eff0: 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
f000: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
f010: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
f020: 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
f030: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
f040: 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
f050: 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
f060: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f070: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f080: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f090: 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
f0a0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
f0b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
f0c0: 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
f0d0: 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
f0e0: 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
f0f0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
f100: 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
f110: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
f120: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
f130: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f140: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f150: 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
f160: 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
f170: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f180: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
f190: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
f1a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
f1b0: 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
f1c0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
f1d0: 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
f1e0: 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
f1f0: 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
f200: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
f210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
f220: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
f230: 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
f240: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
f250: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
f260: 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
f270: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
f280: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
f290: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
f2a0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
f2b0: 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
f2c0: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
f2d0: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
f2e0: 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
f2f0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
f300: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
f310: 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
f320: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
f330: 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
f340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f360: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
f370: 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
f380: 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
f390: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
f3a0: 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
f3b0: 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
f3c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f3e0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
f3f0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
f400: 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
f410: 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
f420: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
f430: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
f440: 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
f450: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
f460: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f470: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
f480: 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
f490: 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
f4a0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f4b0: 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
f4c0: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
f4d0: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
f4e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
f500: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
f510: 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
f520: 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
f530: 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
f540: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
f550: 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
f560: 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
f570: 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   valid..*/.stati
f580: 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
f590: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
f5a0: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
f5b0: 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
f5c0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
f5d0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
f5e0: 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
f5f0: 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
f600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
f610: 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
f620: 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
f630: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
f640: 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
f650: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
f660: 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
f670: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
f680: 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20  gno iFreePage   
f690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
f6a0: 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
f6b0: 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b  pDbPage to */.){
f6c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
f6d0: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
f6e0: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
f6f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
f700: 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
f710: 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
f720: 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
f730: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
f740: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
f750: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
f760: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
f770: 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
f780: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
f790: 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
f7a0: 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
f7b0: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
f7c0: 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
f7d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f7e0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f7f0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f800: 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
f810: 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
f820: 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
f830: 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
f840: 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
f850: 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
f860: 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
f870: 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
f880: 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
f890: 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
f8a0: 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
f8b0: 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
f8c0: 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
f8d0: 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
f8e0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f8f0: 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
f900: 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
f910: 65 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  e, iFreePage);. 
f920: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f930: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
f940: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
f950: 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
f960: 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
f970: 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
f980: 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
f990: 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
f9a0: 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
f9b0: 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
f9c0: 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
f9d0: 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
f9e0: 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
f9f0: 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
fa00: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
fa10: 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
fa20: 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
fa30: 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
fa40: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
fa50: 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
fa60: 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
fa70: 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
fa80: 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
fa90: 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
faa0: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
fab0: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
fac0: 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
fad0: 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
fae0: 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
faf0: 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
fb00: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
fb10: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
fb20: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
fb30: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
fb40: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
fb50: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
fb60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
fb70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fb80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
fb90: 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
fba0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
fbb0: 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
fbc0: 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
fbd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
fbe0: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
fbf0: 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
fc00: 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
fc10: 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
fc20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fc30: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
fc40: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
fc50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
fc60: 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
fc70: 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
fc80: 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
fc90: 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
fca0: 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
fcb0: 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
fcc0: 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
fcd0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
fce0: 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
fcf0: 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
fd00: 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
fd10: 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
fd20: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
fd30: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
fd40: 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
fd50: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
fd60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fd80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fd90: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
fda0: 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
fdb0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
fdc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fdd0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
fde0: 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
fdf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fe00: 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
fe10: 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
fe20: 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
fe30: 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
fe40: 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
fe50: 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
fe60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
fe70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
fe80: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
fe90: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
fea0: 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20  pe, iPtrPage);. 
feb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
fec0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
fed0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
fee0: 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
fef0: 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
ff00: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
ff10: 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
ff20: 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
ff30: 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
ff40: 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
ff50: 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
ff60: 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
ff70: 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
ff80: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
ff90: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
ffa0: 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
ffb0: 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
ffc0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
ffd0: 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
ffe0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
fff0: 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
10000 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
10010 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
10020 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
10030 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
10040 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
10050 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
10060 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
10070 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
10080 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
10090 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
100a0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
100b0 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
100c0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
100d0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
100e0 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
100f0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
10100 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
10110 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
10120 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
10130 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
10140 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
10150 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
10160 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
10170 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
10180 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
10190 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
101a0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
101b0 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
101c0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
101d0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
101e0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b  pBt, Pgno nFin){
101f0 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b  .  Pgno iLastPg;
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10210 4c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  Last page in the
10220 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
10230 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
10240 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10250 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
10260 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
10270 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
10280 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10290 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
102a0 29 3b 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70  );.  iLastPg = p
102b0 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66  Bt->nTrunc;.  if
102c0 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a  ( iLastPg==0 ){.
102d0 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 73 71      iLastPg = sq
102e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
102f0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10300 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54  ;.  }..  if( !PT
10310 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
10320 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
10330 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
10340 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
10350 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
10360 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
10370 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
10380 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
10390 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
103a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
103b0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
103c0 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69  st==0 || nFin==i
103d0 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20  LastPg ){.      
103e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
103f0 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
10400 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
10410 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
10420 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
10430 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10450 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10460 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
10470 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
10480 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10490 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
104a0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
104b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
104c0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
104d0 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
104e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
104f0 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
10500 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
10510 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
10520 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
10530 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
10540 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
10550 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
10560 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
10570 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
10580 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
10590 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
105a0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
105b0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
105c0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
105d0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
105e0 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
105f0 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
10600 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
10610 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
10620 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
10630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
10640 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
10650 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
10660 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
10670 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
10680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
106a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
106b0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
106c0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
106d0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
106e0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
106f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
10700 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
10710 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
10720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10730 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
10740 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
10750 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
10760 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
10770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10780 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10790 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
107a0 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
107b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
107c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
107d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
107e0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
107f0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
10800 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
10810 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
10820 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
10830 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
10840 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
10850 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
10860 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
10870 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10880 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
10890 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
108a0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
108b0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
108c0 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
108d0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
108e0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
108f0 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
10900 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
10910 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
10920 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10930 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
10940 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
10950 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
10960 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
10970 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
10980 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
10990 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
109a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
109b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
109c0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
109d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
109e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
109f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
10a00 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
10a10 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
10a20 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
10a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
10a40 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
10a50 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
10a60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10a70 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
10a80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
10a90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10ab0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
10ac0 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
10ad0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
10ae0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
10af0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10b00 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
10b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10b30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42  .    }.  }..  pB
10b50 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73  t->nTrunc = iLas
10b60 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  tPg - 1;.  while
10b70 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50  ( pBt->nTrunc==P
10b80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
10b90 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
10ba0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
10bb0 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42  Trunc) ){.    pB
10bc0 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d  t->nTrunc--;.  }
10bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10be0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
10bf0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10c00 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
10c10 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
10c20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
10c30 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
10c40 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
10c50 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
10c60 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
10c70 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
10c80 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
10c90 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
10ca0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
10cb0 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
10cc0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
10cd0 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
10ce0 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
10cf0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
10d00 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
10d10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
10d20 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
10d30 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
10d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10d50 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
10d60 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
10d70 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
10d80 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
10d90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10da0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
10db0 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
10dc0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
10dd0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
10de0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
10df0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
10e00 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
10e10 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
10e20 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
10e30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10e40 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
10e50 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
10e60 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
10e70 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a  umStep(pBt, 0);.
10e80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
10e90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10ea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10eb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10ec0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
10ed0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
10ee0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
10ef0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
10f00 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
10f10 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
10f20 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
10f30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10f40 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
10f50 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
10f60 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
10f70 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10f80 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
10f90 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
10fa0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
10fb0 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
10fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
10fd0 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
10fe0 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
10ff0 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
11000 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
11010 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
11020 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
11030 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
11040 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75  pBt, Pgno *pnTru
11050 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
11060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
11070 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
11080 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65  ->pPager;.#ifnde
11090 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  f NDEBUG.  int n
110a0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
110b0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
110c0 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  r);.#endif..  as
110d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
110e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
110f0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
11100 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
11110 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
11120 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
11130 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
11140 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
11150 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
11160 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d  0;..    if( pBt-
11170 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20  >nTrunc==0 ){.  
11180 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a      Pgno nFree;.
11190 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d        Pgno nPtrm
111a0 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ap;.      const 
111b0 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
111c0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
111d0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 73 71 6c  Pgno nOrig = sql
111e0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
111f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
11200 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  ..      if( PTRM
11210 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
11220 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20  Orig) ){.       
11230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11240 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11250 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
11260 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
11270 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11280 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b          nOrig--;
11290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
112a0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
112b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
112c0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20  ata[36]);.      
112d0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
112e0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
112f0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
11300 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
11310 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20  );.      nFin = 
11320 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
11330 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69  nPtrmap;.      i
11340 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
11350 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
11360 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
11370 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
11380 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d  ){.        nFin-
11390 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
113a0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
113b0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
113c0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
113d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
113e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
113f0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
11400 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
11410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11420 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
11430 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
11440 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
11450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
11460 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  NE ){.      asse
11470 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42  rt(nFin==0 || pB
11480 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20  t->nTrunc==0 || 
11490 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e  nFin<=pBt->nTrun
114a0 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  c);.      rc = S
114b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
114c0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
114d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
114e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
114f0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
11500 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
11510 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11520 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
11530 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11540 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
11550 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
11560 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
11570 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b  ->nTrunc = nFin;
11580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11590 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
115a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
115b0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
115c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
115d0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
115e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
115f0 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74    *pnTrunc = pBt
11600 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42  ->nTrunc;.    pB
11610 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  t->nTrunc = 0;. 
11620 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
11630 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
11640 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
11650 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11660 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  }..#endif../*.**
11670 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
11680 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
11690 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
116a0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
116b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
116c0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
116d0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
116e0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
116f0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
11700 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
11710 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
11720 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
11730 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
11740 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
11750 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
11760 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11770 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11780 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
11790 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
117a0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
117b0 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
117c0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
117d0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
117e0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
117f0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
11800 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
11810 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
11820 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
11830 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
11840 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
11850 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
11860 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
11870 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
11880 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
11890 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
118a0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
118b0 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
118c0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
118d0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
118e0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
118f0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
11900 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11910 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  it() for the sec
11920 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
11930 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
11940 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
11950 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
11960 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
11970 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
11980 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
11990 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
119a0 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
119b0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
119c0 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
119d0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
119e0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
119f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11a00 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
11a10 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
11a20 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
11a30 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
11a40 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
11a50 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
11a60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
11a70 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
11a80 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
11a90 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
11aa0 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
11ab0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ac0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
11ad0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
11ae0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
11af0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
11b00 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
11b10 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
11b20 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
11b30 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
11b40 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
11b50 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
11b60 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
11b70 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11b80 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
11b90 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
11ba0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
11bb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11bc0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11bd0 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
11be0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
11bf0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
11c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
11c10 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
11c20 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
11c30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11c40 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
11c50 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
11c60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11c70 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64  r(p);.    pBt->d
11c80 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64  b = p->db;.#ifnd
11c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11ca0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
11cb0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
11cc0 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
11cd0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
11ce0 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20  (pBt, &nTrunc); 
11cf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11d10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11d20 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
11d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11d40 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
11d50 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
11d60 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
11d70 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
11d80 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  r, zMaster, nTru
11d90 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
11da0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
11dd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11de0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
11df0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
11e00 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
11e10 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
11e20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
11e30 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
11e40 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ** sqlite3BtreeS
11e50 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  ync() routine do
11e60 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
11e70 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  se and should be
11e80 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f   invoked.** prio
11e90 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
11ea0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
11eb0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
11ec0 28 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a  () routine did.*
11ed0 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  * all the work o
11ee0 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
11ef0 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
11f00 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
11f10 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
11f20 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
11f30 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
11f40 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
11f50 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
11f60 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
11f70 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
11f80 61 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ate the rollback
11f90 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69   journal.** (whi
11fa0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
11fb0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
11fc0 6d 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f  mit) and drop lo
11fd0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
11fe0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
11ff0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
12000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12010 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
12020 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
12030 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
12040 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
12050 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
12060 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12070 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
12080 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12090 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
120a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
120b0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
120c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65  = p->db;.  btree
120d0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
120e0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
120f0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
12100 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
12110 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
12120 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
12130 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
12140 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
12150 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
12160 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
12170 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
12180 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
12190 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
121a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
121b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
121c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
121d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
121e0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
121f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
12200 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
12210 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
12220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12230 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
12240 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12250 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12260 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
12270 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
12280 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42  ANS_READ;.    pB
12290 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
122a0 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   }.  unlockAllTa
122b0 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  bles(p);..  /* I
122c0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
122d0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
122e0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
122f0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61  ecrement the tra
12300 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
12310 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
12320 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
12330 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
12340 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  t reaches 0, set
12350 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64  .  ** the shared
12360 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
12370 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
12380 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20  BtreeIfUnused() 
12390 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20  call below.  ** 
123a0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
123b0 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pager..  */.  if
123c0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
123d0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
123e0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
123f0 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
12400 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12410 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
12420 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
12430 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
12440 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
12450 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72  the handles curr
12460 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12470 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
12480 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20  ONE and unlock. 
12490 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66   ** the pager if
124a0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
124b0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
124c0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
124d0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  tion..  */.  p->
124e0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
124f0 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
12500 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
12510 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
12520 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
12530 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12550 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
12560 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
12570 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
12580 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12590 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
125a0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
125b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
125c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
125d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
125e0 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
125f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12610 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12620 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
12630 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12640 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12650 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
12660 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
12670 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
12680 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
12690 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
126a0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
126b0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
126c0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
126d0 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
126e0 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
126f0 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
12700 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
12710 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
12720 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
12730 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
12740 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
12750 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
12760 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
12770 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
12780 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
12790 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
127a0 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
127b0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
127c0 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
127d0 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
127e0 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
127f0 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
12800 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
12810 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
12820 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
12830 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
12840 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
12850 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
12860 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
12870 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
12880 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
12890 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
128a0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
128b0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
128c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
128d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
128e0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
128f0 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
12900 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
12910 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
12920 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
12930 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
12940 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
12950 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
12960 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
12970 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
12980 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
12990 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
129a0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
129b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
129c0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
129d0 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
129e0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
129f0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
12a00 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
12a10 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
12a20 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
12a30 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
12a40 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
12a50 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
12a60 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
12a70 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
12a80 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
12a90 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
12aa0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
12ab0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
12ac0 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
12ad0 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
12ae0 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
12af0 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
12b00 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
12b10 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
12b20 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
12b30 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
12b40 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
12b50 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
12b60 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
12b70 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
12b80 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
12b90 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
12ba0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
12bb0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
12bc0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
12bd0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
12be0 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
12bf0 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
12c00 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
12c10 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
12c20 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
12c30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
12c40 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
12c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
12c60 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
12c70 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
12c80 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
12c90 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
12ca0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
12cb0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
12cc0 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
12cd0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
12ce0 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
12cf0 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
12d00 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
12d10 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
12d20 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
12d30 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
12d40 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
12d50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12d60 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
12d70 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
12d80 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
12d90 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
12da0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
12db0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
12dc0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
12dd0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
12de0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12df0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
12e00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12e10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
12e20 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
12e30 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
12e40 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
12e50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12e60 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12e70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
12e90 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
12ea0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
12eb0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
12ec0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
12ed0 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  lst.    ** tryin
12ee0 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72  g to save cursor
12ef0 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74   positions. If t
12f00 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  his is an automa
12f10 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73  tic rollback (as
12f20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75  .    ** the resu
12f30 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  lt of a constrai
12f40 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  nt, malloc() fai
12f50 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72  lure or IO error
12f60 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  ) then .    ** t
12f70 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20  he cache may be 
12f80 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e  internally incon
12f90 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e  sistent (not con
12fa0 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73  tain valid trees
12fb0 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63  ) so.    ** we c
12fc0 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74  annot simply ret
12fd0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f  urn the error to
12fe0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73   the caller. Ins
12ff0 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20  tead, abort .   
13000 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20   ** all queries 
13010 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e  that may be usin
13020 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72  g any of the cur
13030 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64  sors that failed
13040 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f   to save..    */
13050 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
13060 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
13070 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64  p, rc);.  }.#end
13080 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  if.  btreeIntegr
13090 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b  ity(p);.  unlock
130a0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
130b0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
130c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
130d0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69      int rc2;..#i
130e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
130f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13100 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
13110 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  ;.#endif..    as
13120 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
13130 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
13140 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
13150 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
13160 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
13170 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
13180 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
13190 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
131a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
131b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
131c0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
131d0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
131e0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
131f0 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74  * call sqlite3Bt
13200 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
13210 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
13220 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
13230 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
13240 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
13250 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13260 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
13270 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
13280 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
13290 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
132a0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
132b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
132c0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
132d0 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
132e0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
132f0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
13300 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
13310 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
13320 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NE ){.    assert
13330 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
13340 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
13350 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
13360 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
13370 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
13380 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
13390 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
133a0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
133b0 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   }..  p->inTrans
133c0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
133d0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
133e0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
133f0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
13400 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
13410 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
13420 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13430 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13440 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
13450 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
13460 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e  on.  The subtran
13470 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63  saction can.** c
13480 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
13490 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
134a0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
134b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20  saction..** You 
134c0 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
134d0 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
134e0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
134f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
13500 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
13510 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
13520 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d  tically if the m
13530 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ain transaction.
13540 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  ** commits or ro
13550 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
13560 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e  Only one subtran
13570 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61  saction may be a
13580 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e  ctive at a time.
13590 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
135a0 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74   to try.** to st
135b0 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61  art a new subtra
135c0 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74  nsaction if anot
135d0 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69  her subtransacti
135e0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
135f0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  tive..**.** Stat
13600 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
13610 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
13620 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
13630 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
13640 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
13650 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
13660 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
13670 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
13680 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
13690 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
136a0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
136b0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
136c0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
136d0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
136e0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
136f0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
13700 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
13710 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
13720 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
13730 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
13740 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
13750 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13760 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13770 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
13780 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
13790 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
137a0 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
137b0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
137c0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
137d0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
137e0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
137f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
13800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13810 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13820 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
13830 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
13840 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
13850 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65  OK : sqlite3Page
13860 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e  rStmtBegin(pBt->
13870 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
13880 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
13890 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
138a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
138b0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
138c0 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74   Commit the stat
138d0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
138e0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
138f0 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e   progress.  If n
13900 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74  o.** subtransact
13910 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74  ion is active, t
13920 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
13930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13940 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74  reeCommitStmt(Bt
13950 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13960 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
13970 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
13980 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13990 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
139a0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
139b0 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
139c0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
139d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
139e0 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
139f0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
13a00 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
13a10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13a20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
13a30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13a40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13a50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
13a60 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69  ollback the acti
13a70 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  ve statement sub
13a80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
13a90 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69   no subtransacti
13aa0 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20  on.** is active 
13ab0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13ac0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
13ad0 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
13ae0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  be invalidated b
13af0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
13b00 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a  .  Any attempt.*
13b10 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  * to use a curso
13b20 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  r that was open 
13b30 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13b40 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13b50 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c  on.** will resul
13b60 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
13b70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13b80 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42  eeRollbackStmt(B
13b90 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13bb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13bc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
13bd0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
13be0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
13bf0 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  >db;.  if( pBt->
13c00 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
13c10 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13c20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13c30 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42  rStmtRollback(pB
13c40 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
13c50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
13c60 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
13c70 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
13c80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
13c90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13ca0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13cb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61  c;.}../*.** Defa
13cc0 75 6c 74 20 6b 65 79 20 63 6f 6d 70 61 72 69 73  ult key comparis
13cd0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  on function to b
13ce0 65 20 75 73 65 64 20 69 66 20 6e 6f 20 63 6f 6d  e used if no com
13cf0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
13d00 0a 2a 2a 20 69 73 20 73 70 65 63 69 66 69 65 64  .** is specified
13d10 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 33 42   on the sqlite3B
13d20 74 72 65 65 43 75 72 73 6f 72 28 29 20 63 61 6c  treeCursor() cal
13d30 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
13d40 20 64 66 6c 74 43 6f 6d 70 61 72 65 28 0a 20 20   dfltCompare(.  
13d50 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 20  void *NotUsed,  
13d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
13d70 65 72 20 64 61 74 61 20 69 73 20 6e 6f 74 20 75  er data is not u
13d80 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c  sed */.  int n1,
13d90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c   const void *p1,
13da0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79      /* First key
13db0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
13dc0 20 69 6e 74 20 6e 32 2c 20 63 6f 6e 73 74 20 76   int n2, const v
13dd0 6f 69 64 20 2a 70 32 20 20 20 20 20 2f 2a 20 53  oid *p2     /* S
13de0 65 63 6f 6e 64 20 6b 65 79 20 74 6f 20 63 6f 6d  econd key to com
13df0 70 61 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pare */.){.  int
13e00 20 63 3b 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70   c;.  c = memcmp
13e10 28 70 31 2c 20 70 32 2c 20 6e 31 3c 6e 32 20 3f  (p1, p2, n1<n2 ?
13e20 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69 66 28   n1 : n2);.  if(
13e30 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d   c==0 ){.    c =
13e40 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20   n1 - n2;.  }.  
13e50 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
13e60 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
13e70 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
13e80 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
13e90 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
13ea0 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61  * iTable.  The a
13eb0 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20  ct of acquiring 
13ec0 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20  a cursor gets a 
13ed0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  read lock on .**
13ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13ef0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  le..**.** If wrF
13f00 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
13f10 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
13f20 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
13f30 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
13f40 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
13f50 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
13f60 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
13f70 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
13f80 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
13f90 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
13fa0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
13fb0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
13fc0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
13fd0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
13fe0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
13ff0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
14000 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
14010 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
14020 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
14030 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
14040 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
14050 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14060 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
14070 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
14080 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
14090 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
140a0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
140b0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
140c0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
140d0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
140e0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
140f0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
14100 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
14110 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
14120 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
14130 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
14140 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
14150 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
14160 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
14170 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14180 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
14190 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
141a0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
141b0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
141c0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
141d0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
141e0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
141f0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
14200 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
14210 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
14220 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
14230 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
14240 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
14250 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
14260 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
14270 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
14280 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
14290 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ectly..**.** The
142a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
142b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6c 6f 67  tion must be log
142c0 69 63 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  ically the same 
142d0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
142e0 0a 2a 2a 20 6f 6e 20 61 20 70 61 72 74 69 63 75  .** on a particu
142f0 6c 61 72 20 74 61 62 6c 65 2e 20 20 43 68 61 6e  lar table.  Chan
14300 67 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  ging the compari
14310 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  son function wil
14320 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 69  l result.** in i
14330 6e 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69  ncorrect operati
14340 6f 6e 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ons.  If the com
14350 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
14360 20 69 73 20 4e 55 4c 4c 2c 20 61 0a 2a 2a 20 64   is NULL, a.** d
14370 65 66 61 75 6c 74 20 63 6f 6d 70 61 72 69 73 6f  efault compariso
14380 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  n function is us
14390 65 64 2e 20 20 54 68 65 20 63 6f 6d 70 61 72 69  ed.  The compari
143a0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  son function is.
143b0 2a 2a 20 61 6c 77 61 79 73 20 69 67 6e 6f 72 65  ** always ignore
143c0 64 20 66 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  d for INTKEY tab
143d0 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
143e0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
143f0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14420 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
14430 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14460 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
14470 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
14480 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
144b0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
144c0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 28  -only */.  int (
144d0 2a 78 43 6d 70 29 28 76 6f 69 64 2a 2c 69 6e 74  *xCmp)(void*,int
144e0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
144f0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 20 2f  ,const void*), /
14500 2a 20 4b 65 79 20 43 6f 6d 70 61 72 69 73 6f 6e  * Key Comparison
14510 20 66 75 6e 63 20 2a 2f 0a 20 20 76 6f 69 64 20   func */.  void 
14520 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
14550 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
14560 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
14570 2a 2a 70 70 43 75 72 20 20 20 20 20 20 20 20 20  **ppCur         
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
145a0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
145b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
145c0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
145d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
145e0 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
145f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
14600 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
14610 20 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20 20    *ppCur = 0;.  
14620 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
14630 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
14640 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nly ){.      ret
14650 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
14660 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
14670 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
14680 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 20  s(p, iTable, 0) 
14690 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
146a0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
146b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
146c0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
146d0 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42  {.    rc = lockB
146e0 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
146f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14720 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  }.    if( pBt->r
14730 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61  eadOnly && wrFla
14740 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
14750 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
14760 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  Y;.    }.  }.  p
14770 43 75 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Cur = sqlite3Mal
14780 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
14790 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  *pCur) );.  if( 
147a0 70 43 75 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pCur==0 ){.    r
147b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
147c0 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
147d0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
147e0 6f 6e 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  on;.  }.  pCur->
147f0 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
14800 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69  )iTable;.  if( i
14810 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69  Table==1 && sqli
14820 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14830 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
14840 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
14850 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
14860 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
14870 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
14880 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
14890 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
148a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
148b0 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20  ur->pPage, 0);. 
148c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
148d0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
148e0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
148f0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  eption;.  }..  /
14900 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
14910 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
14920 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
14930 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
14940 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
14950 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75  les, link the cu
14960 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
14970 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20  Shared list and 
14980 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a  set *ppCur (the.
14990 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75    ** output argu
149a0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
149b0 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70  ction)..  */.  p
149c0 43 75 72 2d 3e 78 43 6f 6d 70 61 72 65 20 3d 20  Cur->xCompare = 
149d0 78 43 6d 70 20 3f 20 78 43 6d 70 20 3a 20 64 66  xCmp ? xCmp : df
149e0 6c 74 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 75  ltCompare;.  pCu
149f0 72 2d 3e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  r->pArg = pArg;.
14a00 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
14a10 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
14a20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
14a30 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a  rFlag = wrFlag;.
14a40 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
14a50 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
14a60 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
14a70 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
14a80 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
14a90 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
14aa0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
14ab0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
14ac0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
14ad0 2a 70 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 0a  *ppCur = pCur;..
14ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14af0 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73  OK;..create_curs
14b00 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
14b10 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
14b20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
14b30 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 73 71  ->pPage);.    sq
14b40 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
14b50 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74  ;.  }.  unlockBt
14b60 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
14b70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14b90 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
14ba0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
14bd0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
14be0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
14c10 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
14c20 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
14c30 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
14c60 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
14c70 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  /.  int (*xCmp)(
14c80 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
14c90 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
14ca0 76 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43  void*), /* Key C
14cb0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a  omparison func *
14cc0 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20  /.  void *pArg, 
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
14d00 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
14d10 42 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  BtCursor **ppCur
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
14d40 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
14d50 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
14d60 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
14d70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
14d80 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
14d90 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
14da0 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
14db0 20 77 72 46 6c 61 67 2c 20 78 43 6d 70 2c 20 70   wrFlag, xCmp, p
14dc0 41 72 67 2c 20 70 70 43 75 72 29 3b 0a 20 20 73  Arg, ppCur);.  s
14dd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14de0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14df0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ;.}.../*.** Clos
14e00 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
14e10 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
14e20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14e30 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
14e40 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
14e50 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
14e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14e70 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
14e80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
14e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14ea0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 42 74   pCur->pBt;.  Bt
14eb0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
14ec0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 0a 20 20 73  ur->pBtree;..  s
14ed0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14ee0 28 70 42 74 72 65 65 29 3b 0a 20 20 70 42 74 2d  (pBtree);.  pBt-
14ef0 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  >db = pBtree->db
14f00 3b 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50  ;.  clearCursorP
14f10 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
14f20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
14f30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50   ){.    pCur->pP
14f40 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
14f50 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
14f60 65 7b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  e{.    pBt->pCur
14f70 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
14f80 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  t;.  }.  if( pCu
14f90 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
14fa0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
14fb0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
14fc0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
14fd0 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
14fe0 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
14ff0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
15000 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
15010 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
15020 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
15030 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
15040 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
15050 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15060 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
15070 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
15080 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
15090 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
150a0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
150b0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
150c0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
150d0 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
150e0 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
150f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15100 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
15110 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15120 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
15130 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15140 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15150 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
15160 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
15170 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
15180 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
15190 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
151a0 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
151b0 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
151c0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
151d0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
151e0 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
151f0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15200 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
15210 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
15220 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
15230 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
15240 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
15250 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
15260 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15270 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
15280 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
15290 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
152a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
152b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
152c0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
152d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
152e0 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
152f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
15300 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15310 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
15320 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
15330 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
15340 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
15350 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
15360 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
15370 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
15380 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
15390 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
153a0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
153b0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
153c0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
153d0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
153e0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
153f0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
15400 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
15410 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
15420 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
15430 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
15440 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
15450 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
15460 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
15470 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
15480 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
15490 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
154a0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
154b0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
154c0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
154d0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
154e0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
154f0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
15500 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
15510 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
15520 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
15530 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
15540 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
15550 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
15560 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
15570 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
15580 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
15590 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
155a0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
155b0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
155c0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
155d0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
155e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
155f0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
15600 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15610 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15620 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
15630 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
15640 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
15650 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
15660 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15670 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
15680 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
15690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
156a0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
156b0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
156c0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
156d0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
156e0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
156f0 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
15700 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
15710 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
15720 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
15730 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
15740 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
15750 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
15760 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
15770 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
15780 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
15790 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
157a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
157b0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
157c0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
157d0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
157e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157f0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15800 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
15810 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
15820 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
15830 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
15840 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
15850 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
15860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
15870 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
15880 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
15890 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
158d0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
15910 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15920 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
15930 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
15940 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
15950 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
159a0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
159b0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
159f0 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
15a00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
15a10 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
15a20 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
15a30 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
15a40 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
15a50 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
15a60 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
15a70 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
15a80 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
15a90 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
15aa0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
15ab0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
15ac0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
15ad0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
15ae0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
15af0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
15b00 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
15b10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15b20 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
15b30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15b40 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
15b50 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
15b60 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
15b70 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
15b80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15b90 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
15ba0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
15bb0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15bc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
15be0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
15bf0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15c00 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
15c10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
15c20 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
15c30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15c40 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
15c50 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
15c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
15c70 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
15c80 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
15c90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
15ca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15cc0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
15cd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15ce0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
15cf0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
15d00 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
15d10 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
15d20 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
15d30 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
15d40 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
15d50 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
15d60 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
15d70 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
15d80 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
15d90 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
15da0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
15db0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
15dc0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
15dd0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
15de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15df0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
15e00 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
15e10 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
15e20 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
15e30 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
15e40 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
15e50 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
15e60 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15e70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
15e90 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
15ea0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15eb0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
15ec0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
15ed0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
15ee0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
15ef0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
15f00 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
15f10 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
15f20 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
15f30 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
15f40 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
15f50 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
15f60 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
15f70 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
15f80 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
15f90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
15fb0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
15fc0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
15fd0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
15fe0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
15ff0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
16000 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
16010 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16020 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
16030 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
16040 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
16050 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
16060 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
16070 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
16080 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
16090 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
160a0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
160b0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
160c0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
160d0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
160e0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
160f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16100 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
16110 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70  :.**.** Unless p
16120 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
16130 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  , the page numbe
16140 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
16150 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20  erflow .** page 
16160 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
16170 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  st is written to
16180 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
16190 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20  page ovfl.** is 
161a0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
161b0 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74   its linked list
161c0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
161d0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
161e0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
161f0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61   not NULL, *ppPa
16200 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
16210 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65   MemPage* handle
16220 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66  .** for page ovf
16230 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  l. The underlyin
16240 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61 79  g pager page may
16250 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
16260 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  sted.** with the
16270 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
16280 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65  set, so the page
16290 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c 65   data accessable
162a0 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e   via.** this han
162b0 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74  dle may not be t
162c0 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  rusted..*/.stati
162d0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
162e0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
162f0 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
16300 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
16310 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
16320 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
16330 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
16340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16350 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
16360 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
16370 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
16380 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
16390 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
163a0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
163b0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69  no next = 0;.  i
163c0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
163d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
163e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
163f0 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20   );.  /* One of 
16400 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62  these must not b
16410 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  e NULL. Otherwis
16420 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73  e, why call this
16430 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20   function? */.  
16440 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c  assert(ppPage ||
16450 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20   pPgnoNext);..  
16460 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20  /* If pPgnoNext 
16470 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
16480 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
16490 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f  eing called to o
164a0 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d  btain.  ** a Mem
164b0 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20  Page* reference 
164c0 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61  only. No page-da
164d0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ta is required i
164e0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
164f0 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65  /.  if( !pPgnoNe
16500 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  xt ){.    return
16510 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16520 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
16530 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a  ppPage, 1);.  }.
16540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16550 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16560 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
16570 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16580 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
16590 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
165a0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
165b0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
165c0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
165d0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
165e0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
165f0 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
16600 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
16610 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
16620 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
16630 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
16640 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
16650 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
16660 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
16670 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
16680 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
16690 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
166a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
166b0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
166c0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
166d0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
166e0 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
166f0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
16700 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
16710 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
16720 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16730 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
16740 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
16750 69 66 28 20 69 47 75 65 73 73 3c 3d 73 71 6c 69  if( iGuess<=sqli
16760 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
16770 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
16780 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
16790 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
167a0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
167b0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
167c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
167d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
167e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
167f0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16800 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
16810 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
16820 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
16830 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ss;.      }.    
16840 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
16850 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70  if( next==0 || p
16860 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d  pPage ){.    Mem
16870 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
16880 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
16890 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
168a0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
168b0 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20  , next!=0);.    
168c0 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
168d0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
168e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d  );.    if( next=
168f0 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
16900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
16910 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
16920 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
16930 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50 61 67  }..    if( ppPag
16940 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61  e ){.      *ppPa
16950 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20  ge = pPage;.    
16960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c  }else{.      rel
16970 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
16980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
16990 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
169a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
169b0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
169c0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
169d0 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
169e0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
169f0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
16a00 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
16a10 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
16a20 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
16a30 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
16a40 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
16a50 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
16a60 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
16a70 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
16a80 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
16a90 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
16aa0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
16ab0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
16ac0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
16ad0 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
16ae0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
16af0 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
16b00 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
16b10 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
16b20 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
16b30 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
16b40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
16b50 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
16b60 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
16b70 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
16b80 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
16b90 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
16ba0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
16bb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
16bc0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
16bd0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
16be0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16bf0 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
16c00 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
16c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16c20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
16c30 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
16c40 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
16c50 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
16c60 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
16c70 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
16c80 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
16c90 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
16ca0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
16cb0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
16cc0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
16cd0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
16ce0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
16cf0 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
16d00 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
16d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16d20 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
16d30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16d60 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
16d70 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
16d80 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
16d90 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
16da0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
16db0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
16dc0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
16dd0 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
16de0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
16df0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
16e10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
16e20 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
16e30 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
16e40 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
16e50 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
16e60 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
16e70 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
16e80 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
16e90 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
16ea0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
16eb0 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
16ec0 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
16ed0 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
16ee0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
16ef0 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
16f00 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
16f10 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
16f20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
16f30 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
16f40 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
16f50 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
16f60 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
16f70 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
16f80 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
16f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16fa0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
16fb0 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74   distinction bet
16fc0 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74  ween key and dat
16fd0 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65  a..** It just re
16fe0 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62 79  ads or writes by
16ff0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79  tes from the pay
17000 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74 61  load area.  Data
17010 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61   might .** appea
17020 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
17030 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ge or be scatter
17040 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
17050 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  le overflow .** 
17060 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
17070 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
17080 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
17090 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
170a0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
170b0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
170c0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
170d0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
170e0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
170f0 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
17100 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
17110 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
17120 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
17130 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
17140 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
17150 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
17160 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
17170 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
17180 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
17190 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
171a0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
171b0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
171c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
171d0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
171e0 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
171f0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
17200 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
17210 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
17220 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
17230 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
17240 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
17250 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
17260 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
17270 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
17280 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
17290 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
172a0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
172b0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
172c0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
172d0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
172e0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
172f0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
17300 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
17310 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
17320 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
17330 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
17340 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
17350 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
17360 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
17370 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17380 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
17390 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
173a0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
173b0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
173c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
173d0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
173e0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
173f0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  d */.  int amt, 
17400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17410 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
17420 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
17430 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
17440 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
17450 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
17460 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70  r */ .  int skip
17470 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Key,         /* 
17480 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61 74  offset begins at
17490 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
174a0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65   true */.  int e
174b0 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
174c0 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
174d0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
174e0 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
174f0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
17500 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
17510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
17520 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
17530 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
17540 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
17550 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74  pPage;     /* Bt
17560 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
17570 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
17580 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
17590 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
175a0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
175b0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
175c0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
175d0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
175e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
175f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
17600 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
17610 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
17620 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
17630 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
17640 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
17650 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
17660 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
17670 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
17680 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
17690 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
176a0 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
176b0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
176c0 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
176d0 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75  intKey ? 0 : pCu
176e0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
176f0 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
17700 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
17710 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
17720 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
17730 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
17740 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  a ){.    /* Tryi
17750 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
17760 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
17770 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
17780 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
17790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
177a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ROR;.  }..  /* C
177b0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
177c0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
177d0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
177e0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
177f0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
17800 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
17810 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
17820 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
17830 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
17840 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
17850 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
17860 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
17870 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
17880 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
17890 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
178a0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
178b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
178c0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
178d0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
178e0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
178f0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
17900 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
17910 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70 42  Local;.  }..  pB
17920 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
17930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17940 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
17950 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66     const int ovf
17960 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
17970 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
17980 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
17990 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
179a0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
179b0 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
179c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
179d0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
179e0 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
179f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17a00 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
17a10 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
17a20 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
17a30 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
17a40 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
17a50 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
17a60 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
17a70 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
17a80 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
17a90 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
17aa0 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
17ab0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
17ac0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
17ad0 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
17ae0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17af0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
17b00 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
17b10 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
17b20 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
17b30 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
17b40 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
17b50 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
17b60 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
17b70 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
17b80 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
17b90 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
17ba0 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
17bb0 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
17bc0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
17bd0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
17be0 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
17bf0 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
17c00 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
17c10 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
17c20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
17c30 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
17c40 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
17c50 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
17c60 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vfl);.      if( 
17c70 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e  nOvfl && !pCur->
17c80 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
17c90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17ca0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
17cb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17cc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
17cd0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
17ce0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
17cf0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
17d00 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
17d10 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
17d20 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
17d30 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
17d40 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
17d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17d60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
17d70 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
17d80 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
17d90 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
17da0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
17db0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
17dc0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
17dd0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
17de0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
17df0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
17e00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
17e10 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
17e20 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
17e30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
17e40 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
17e50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
17e60 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
17e70 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
17e80 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
17e90 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17ea0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
17eb0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17ec0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17ed0 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
17ee0 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
17ef0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
17f00 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
17f10 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
17f20 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
17f30 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
17f40 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
17f50 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
17f60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
17f70 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
17f80 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
17f90 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
17fa0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
17fb0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
17fc0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
17fd0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
17fe0 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
17ff0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
18000 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
18010 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
18020 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
18030 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
18040 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
18050 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
18060 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
18070 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
18080 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
18090 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
180a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
180b0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
180c0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
180d0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
180e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
180f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
18100 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
18110 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
18120 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
18130 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
18140 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
18150 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
18160 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
18170 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
18180 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
18190 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
181a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
181b0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
181c0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
181d0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
181e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
181f0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
18200 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
18210 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
18220 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
18230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18240 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
18250 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
18260 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
18270 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
18280 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
18290 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
182a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
182b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
182c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
182d0 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
182e0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
182f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
18300 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
18310 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
18320 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
18330 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
18340 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
18350 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
18360 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
18370 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
18380 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
18390 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
183a0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
183b0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
183c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
183d0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
183e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
183f0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
18400 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
18410 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
18420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18430 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18450 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
18460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18470 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18480 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18490 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
184a0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
184b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
184c0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
184d0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
184e0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
184f0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
18500 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
18510 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
18520 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
18530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18540 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
18550 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
18560 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
18570 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
18580 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
18590 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
185a0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
185b0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
185c0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
185d0 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
185e0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
185f0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
18600 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
18610 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18620 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18630 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
18640 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
18650 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
18660 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
18670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18680 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18690 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
186a0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
186b0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
186c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
186d0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
186e0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
186f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18700 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
18710 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18720 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Page->intKey==0 
18730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18740 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18750 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18760 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18770 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
18780 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18790 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
187a0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
187b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
187c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
187d0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
187e0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
187f0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
18800 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
18810 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
18820 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
18830 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
18840 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
18850 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
18860 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18870 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18880 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
18890 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
188a0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
188b0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
188c0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
188d0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
188e0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
188f0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
18900 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18910 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
18920 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18930 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18940 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
18950 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
18960 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
18970 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
18980 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
18990 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
189a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
189b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
189c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
189d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
189e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
189f0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18a00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18a10 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72  ->idx>=0 && pCur
18a20 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67  ->idx<pCur->pPag
18a30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
18a40 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
18a50 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
18a60 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30   amt, pBuf, 1, 0
18a70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18a80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
18a90 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
18aa0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
18ab0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
18ac0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
18ad0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
18ae0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
18af0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
18b00 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18b10 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
18b20 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
18b30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
18b40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
18b50 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
18b60 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
18b70 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
18b80 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
18b90 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
18ba0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
18bb0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
18bc0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
18bd0 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
18be0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
18bf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18c00 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
18c10 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
18c20 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
18c30 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
18c40 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
18c50 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
18c60 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
18c70 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
18c80 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
18c90 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
18ca0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
18cb0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
18cc0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
18cd0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
18ce0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
18cf0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
18d00 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
18d10 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
18d20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
18d30 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
18d40 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74   reassembly.** t
18d50 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
18d60 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
18d70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
18d80 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
18d90 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
18da0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
18db0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
18dc0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
18dd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
18de0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
18df0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
18e00 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
18e10 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
18e20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18e30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
18e40 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
18e50 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
18e60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
18e70 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
18e80 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
18e90 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
18ea0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
18eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18ec0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
18ed0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
18ee0 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
18ef0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
18f00 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
18f10 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
18f20 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
18f30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18f40 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
18f50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
18f60 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
18f70 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
18f80 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
18f90 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18fa0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18fb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
18fc0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
18fd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18fe0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
18ff0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
19000 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  e;.  assert( pCu
19010 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
19020 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
19030 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ell );.  getCell
19040 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
19050 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
19060 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
19070 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
19080 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
19090 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
190a0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
190b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
190c0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
190d0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
190e0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
190f0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
19100 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
19110 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19120 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
19130 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
19140 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
19150 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
19160 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
19170 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
19180 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
19190 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
191a0 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
191b0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
191c0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
191d0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
191e0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
191f0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
19200 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
19210 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
19220 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
19230 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
19240 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
19250 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
19260 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
19270 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
19280 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
19290 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
192a0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
192b0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
192c0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
192d0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
192e0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
192f0 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
19300 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
19310 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
19320 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
19330 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
19340 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
19350 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
19360 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
19370 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
19380 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
19390 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
193a0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
193b0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
193c0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
193d0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
193e0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
193f0 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
19400 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
19410 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
19420 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
19430 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19440 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19450 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
19460 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19470 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
19480 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
19490 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
194a0 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
194b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
194c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
194d0 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
194e0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
194f0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
19500 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19510 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19520 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
19530 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19540 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
19550 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
19560 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
19570 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
19580 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
19590 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
195a0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
195b0 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
195c0 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
195d0 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
195e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
195f0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
19600 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  move to..*/.stat
19610 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
19620 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
19630 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
19640 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
19650 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
19660 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50    MemPage *pOldP
19670 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
19680 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
19690 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
196a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
196b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
196c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
196d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
196e0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
196f0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
19700 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43  o, &pNewPage, pC
19710 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66  ur->pPage);.  if
19720 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19730 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64  ;.  pNewPage->id
19740 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  xParent = pCur->
19750 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20  idx;.  pOldPage 
19760 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
19770 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68   pOldPage->idxSh
19780 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  ift = 0;.  relea
19790 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29  sePage(pOldPage)
197a0 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
197b0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
197c0 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
197d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
197e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
197f0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
19800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19810 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19830 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19840 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
19850 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
19860 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
19870 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  its table..**.**
19880 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   The virtual roo
19890 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f  t page is the ro
198a0 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74  ot page for most
198b0 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a   tables.  But.**
198c0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72   for the table r
198d0 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c  ooted on page 1,
198e0 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65   sometime the re
198f0 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  al root page.** 
19900 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
19910 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
19920 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20  inter.  In such 
19930 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72  cases the.** vir
19940 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
19950 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
19960 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
19970 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69  r of page.** 1 i
19980 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
19990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
199a0 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  eeIsRootPage(Mem
199b0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
199c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
199d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
199e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
199f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
19a00 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20  x) );.  pParent 
19a10 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
19a20 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
19a30 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19a40 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
19a50 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
19a60 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
19a70 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
19a80 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
19a90 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
19aa0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
19ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
19ac0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
19ad0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
19ae0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
19af0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
19b00 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
19b10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
19b20 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
19b30 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
19b40 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
19b50 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
19b60 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
19b70 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
19b80 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
19b90 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
19ba0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
19bb0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
19bc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
19bd0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
19be0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19bf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
19c00 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
19c10 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
19c20 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
19c30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19c40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
19c50 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19c60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19c70 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
19c80 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
19c90 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b  ert( pPage!=0 );
19ca0 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
19cb0 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
19cc0 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
19cd0 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
19ce0 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
19cf0 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
19d00 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70  .  idxParent = p
19d10 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b  Page->idxParent;
19d20 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
19d30 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
19d40 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
19d50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43  age(pPage);.  pC
19d60 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72  ur->pPage = pPar
19d70 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ent;.  pCur->inf
19d80 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
19d90 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
19da0 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20  idxShift==0 );. 
19db0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78   pCur->idx = idx
19dc0 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parent;.}../*.**
19dd0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
19de0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
19df0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
19e00 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
19e10 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19e20 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
19e30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19e40 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
19e50 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
19e60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19e70 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
19e80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19e90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19ea0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
19eb0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
19ec0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
19ed0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
19ee0 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
19ef0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
19f00 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
19f10 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
19f20 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
19f30 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
19f40 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
19f50 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
19f60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
19f70 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
19f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
19f90 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
19fa0 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
19fb0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19fc0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
19fd0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
19fe0 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
19ff0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1a000 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
1a010 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
1a020 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1a030 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1a040 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1a050 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1a060 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1a070 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
1a080 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
1a090 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1a0a0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1a0b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a0c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1a0d0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
1a0e0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
1a0f0 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
1a100 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
1a110 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a120 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
1a130 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1a140 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1a150 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1a160 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1a170 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1a180 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1a190 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1a1a0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1a1b0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1a1c0 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1a1d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1a1e0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1a1f0 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1a200 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1a210 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
1a220 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1a230 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1a240 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
1a250 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
1a260 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a270 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a280 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1a290 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
1a2a0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a2b0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
1a2c0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1a2d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1a2e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
1a2f0 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
1a300 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
1a310 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
1a320 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
1a330 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a350 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
1a360 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1a370 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1a380 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a390 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a3a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1a3b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a3c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a3d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a3e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a3f0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1a400 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1a410 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
1a420 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1a430 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1a440 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
1a450 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1a460 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1a470 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1a480 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a  e, pCur->idx));.
1a490 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a4a0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a4b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a4c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1a4d0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a4e0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
1a4f0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1a500 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
1a510 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
1a520 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a530 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
1a540 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
1a550 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
1a560 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
1a570 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
1a580 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1a590 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
1a5a0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
1a5b0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
1a5c0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
1a5d0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
1a5e0 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
1a5f0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a600 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
1a610 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
1a620 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
1a630 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
1a640 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
1a650 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
1a660 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a680 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
1a690 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a6a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1a6b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a6c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1a6d0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1a6e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a6f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1a700 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a710 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1a720 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1a730 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1a740 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
1a750 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1a760 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1a770 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1a780 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1a790 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  ;.    pCur->idx 
1a7a0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1a7b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a7c0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a7d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1a7e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a7f0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1a800 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20  ge->nCell - 1;. 
1a810 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1a820 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ize = 0;.  }.  r
1a830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a840 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1a850 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1a860 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1a870 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1a880 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1a890 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1a8a0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1a8b0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1a8c0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1a8d0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1a8e0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1a8f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1a900 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a910 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1a920 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1a930 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1a940 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a950 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1a970 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a980 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1a990 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1a9a0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1a9b0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1a9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a9d0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1a9e0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1a9f0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
1aa00 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1aa10 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1aa20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1aa30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1aa40 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1aa50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1aa60 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ->pPage->nCell>0
1aa70 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1aa80 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1aa90 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1aaa0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1aab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aac0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1aad0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
1aae0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1aaf0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1ab00 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1ab10 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1ab20 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1ab30 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1ab40 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1ab50 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1ab60 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1ab70 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1ab80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
1ab90 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1aba0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1abb0 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
1abc0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1abd0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1abe0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1abf0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1ac00 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1ac10 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1ac20 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1ac30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ac40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1ac50 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1ac60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1ac70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1ac80 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1ac90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1aca0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
1acb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1acc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1acd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ace0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1acf0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
1ad00 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1ad10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ad20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1ad30 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1ad40 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1ad50 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1ad60 72 20 70 4b 65 79 2f 6e 4b 65 79 2e 0a 2a 2a 20  r pKey/nKey..** 
1ad70 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
1ad80 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
1ad90 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
1ada0 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61  only the nKey pa
1adb0 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
1adc0 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
1add0 6f 72 65 64 2e 20 20 46 6f 72 20 6f 74 68 65 72  ored.  For other
1ade0 20 74 61 62 6c 65 73 2c 20 6e 4b 65 79 20 69 73   tables, nKey is
1adf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ae00 79 74 65 73 20 6f 66 20 64 61 74 61 0a 2a 2a 20  ytes of data.** 
1ae10 69 6e 20 70 4b 65 79 2e 20 20 54 68 65 20 63 6f  in pKey.  The co
1ae20 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1ae30 6e 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  n specified when
1ae40 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
1ae50 2a 2a 20 63 72 65 61 74 65 64 20 69 73 20 75 73  ** created is us
1ae60 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 6b 65  ed to compare ke
1ae70 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ys..**.** If an 
1ae80 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1ae90 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1aea0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1aeb0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1aec0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1aed0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1aee0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1aef0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1af00 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1af10 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1af20 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1af30 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1af40 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1af50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1af60 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74  t of comparing t
1af70 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1af80 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1af90 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
1afa0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73  written to *pRes
1afb0 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20   if pRes!=NULL. 
1afc0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a   The meaning of.
1afd0 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  ** this value is
1afe0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1aff0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
1b000 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1b010 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1b020 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1b030 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b040 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
1b050 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20  than pKey or if 
1b060 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1b070 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
1b080 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
1b090 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
1b0a0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
1b0b0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
1b0c0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
1b0d0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1b0e0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1b0f0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
1b120 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  s pKey..**.**   
1b130 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1b140 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1b150 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b160 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
1b190 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
1b1a0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1b1b0 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
1b1c0 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Cur,        /* T
1b1d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
1b1e0 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  moved */.  const
1b1f0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
1b200 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e    /* The key con
1b210 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73  tent for indices
1b220 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74  .  Not used by t
1b230 61 62 6c 65 73 20 2a 2f 0a 20 20 69 36 34 20 6e  ables */.  i64 n
1b240 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1b250 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
1b260 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20 66  y.  Or the key f
1b270 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  or tables */.  i
1b280 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
1b290 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1b2a0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1b2b0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1b2c0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2e0 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20 66   Search result f
1b2f0 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lag */.){.  int 
1b300 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1b310 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b320 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1b330 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b340 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1b350 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1b360 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1b370 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1b380 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1b390 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1b3a0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
1b3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b3c0 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
1b3d0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1b3e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1b3f0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
1b400 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
1b410 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b420 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1b430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b440 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b  _OK;.  }.  for(;
1b450 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
1b460 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
1b470 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
1b480 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b490 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74  ->pPage;.    int
1b4a0 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65   c = -1;  /* pRe
1b4b0 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c  s return if tabl
1b4c0 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20  e is empty must 
1b4d0 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72  be -1 */.    lwr
1b4e0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
1b4f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1b500 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1b510 69 6e 74 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d  intKey && pKey==
1b520 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1b530 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b540 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1b550 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29   if( biasRight )
1b560 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64  {.      pCur->id
1b570 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c  x = upr;.    }el
1b580 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
1b590 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f  idx = (upr+lwr)/
1b5a0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
1b5b0 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72 28   lwr<=upr ) for(
1b5c0 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  ;;){.      void 
1b5d0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
1b5e0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
1b5f0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1b600 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
1b610 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1b620 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ey ){.        u8
1b630 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20   *pCell;.       
1b640 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1b650 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1b660 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1b670 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1b680 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1b690 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1b6a0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1b6b0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1b6c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1b6d0 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ll, &dummy);.   
1b6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1b6f0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1b700 28 75 36 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79  (u64 *)&nCellKey
1b710 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1b720 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  CellKey<nKey ){.
1b730 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
1b740 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b750 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65  if( nCellKey>nKe
1b760 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1b770 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1b780 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b790 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
1b7a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b7b0 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1b7c0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1b7d0 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1b7e0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1b7f0 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1b800 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1b810 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1b820 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1b830 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1b840 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1b850 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43      c = pCur->xC
1b860 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72  ompare(pCur->pAr
1b870 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  g, nCellKey, pCe
1b880 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65  llKey, nKey, pKe
1b890 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
1b8a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  e{.          pCe
1b8b0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  llKey = sqlite3_
1b8c0 6d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79  malloc( nCellKey
1b8d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1b8e0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20  ( pCellKey==0 ) 
1b8f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1b900 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  MEM;.          r
1b910 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b920 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
1b930 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70  llKey, (void *)p
1b940 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1b950 20 20 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43      c = pCur->xC
1b960 6f 6d 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72  ompare(pCur->pAr
1b970 67 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  g, nCellKey, pCe
1b980 6c 6c 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65  llKey, nKey, pKe
1b990 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
1b9a0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
1b9b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1b9c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1b9d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b9e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ba00 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
1ba10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1ba20 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
1ba30 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1ba40 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
1ba50 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20  pCur->idx;.     
1ba60 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d       upr = lwr -
1ba70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
1ba80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1ba90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
1baa0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1bab0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1bac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bae0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
1baf0 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
1bb00 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20   pCur->idx+1;.  
1bb10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bb20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69     upr = pCur->i
1bb30 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1bb40 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1bb50 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1bb60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bb70 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72  pCur->idx = (lwr
1bb80 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +upr)/2;.    }. 
1bb90 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
1bba0 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  upr+1 );.    ass
1bbb0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1bbc0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
1bbd0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1bbe0 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
1bbf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
1bc00 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1bc10 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
1bc20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1bc30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1bc40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1bc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
1bc60 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1bc70 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1bc80 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
1bc90 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
1bca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bcb0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1bcc0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
1bcd0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
1bce0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1bcf0 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1bd00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bd10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1bd20 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a  Cur->idx = lwr;.
1bd30 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1bd40 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 72 63  Size = 0;.    rc
1bd50 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1bd60 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1bd70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1bd80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1bd90 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20   }.  }.  /* NOT 
1bda0 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a 0a 0a 2f  REACHED */.}.../
1bdb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1bdc0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1bdd0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
1bde0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
1bdf0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
1be00 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
1be10 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
1be20 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
1be30 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
1be40 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
1be50 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1be60 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
1be70 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
1be80 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
1be90 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
1bea0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
1beb0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1bec0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1bed0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
1bee0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
1bef0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
1bf00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
1bf10 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1bf20 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
1bf30 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
1bf40 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
1bf50 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
1bf60 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
1bf70 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
1bf80 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
1bf90 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
1bfa0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
1bfb0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
1bfc0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
1bfd0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
1bfe0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1bff0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c000 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
1c010 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c  a cursor..*/.sql
1c020 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72  ite3 *sqlite3Btr
1c030 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74  eeCursorDb(const
1c040 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29   BtCursor *pCur)
1c050 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1c060 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c070 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1c080 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1c090 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1c0a0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->db;.}../*.** A
1c0b0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1c0c0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1c0d0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1c0e0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1c0f0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1c100 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1c110 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1c120 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1c130 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1c140 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c150 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1c160 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1c170 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1c180 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  Res=1..*/.static
1c190 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
1c1a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c1b0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1c1c0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1c1d0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1c1e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c1f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c200 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1c210 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1c220 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1c230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c250 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
1c260 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
1c270 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
1c280 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1c290 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1c2a0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1c2b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c2c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1c2d0 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1c2e0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1c2f0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1c300 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1c310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c320 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1c330 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1c340 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1c350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c360 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1c370 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1c380 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1c390 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
1c3a0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1c3b0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
1c3c0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1c3d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
1c3e0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
1c3f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c400 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c410 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
1c420 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1c430 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
1c440 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1c450 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1c460 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1c470 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c480 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
1c490 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
1c4a0 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29 20  RootPage(pPage) 
1c4b0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
1c4c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1c4d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c4e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1c4f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c500 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1c510 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c520 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43  eMoveToParent(pC
1c530 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
1c540 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c550 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
1c560 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->idx>=pPage->nC
1c570 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
1c580 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1c590 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 7b  age->leafData ){
1c5a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c5b0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
1c5c0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1c5d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1c5e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c5f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c600 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1c610 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
1c620 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
1c630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c640 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1c650 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1c660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
1c670 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1c680 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c690 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1c6a0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1c6b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c6c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1c6d0 3d 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  = btreeNext(pCur
1c6e0 2c 20 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72  , pRes);.  retur
1c6f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c700 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
1c710 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
1c720 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
1c730 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c740 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1c750 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1c760 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1c770 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1c780 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1c790 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c7a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c7b0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1c7c0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1c7d0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1c7e0 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  es=1..*/.static 
1c7f0 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
1c800 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
1c810 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1c820 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
1c830 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gno;.  MemPage *
1c840 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1c850 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c860 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c870 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1c880 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1c890 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1c8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c8b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c8c0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1c8d0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1c8e0 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1c8f0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1c900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c910 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1c920 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
1c930 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1c940 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1c950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c960 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1c970 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
1c980 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
1c990 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1c9a0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1c9b0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29  ( pCur->idx>=0 )
1c9c0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
1c9d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1c9e0 20 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e   = get4byte( fin
1c9f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1ca00 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72  r->idx) );.    r
1ca10 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ca20 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
1ca30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ca40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ca50 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
1ca60 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
1ca70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
1ca80 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d  hile( pCur->idx=
1ca90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1caa0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1cab0 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b  otPage(pPage) ){
1cac0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1cad0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1cae0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1caf0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1cb00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cb10 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1cb20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
1cb30 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1cb40 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1cb50 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1cb60 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64    }.    pCur->id
1cb70 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x--;.    pCur->i
1cb80 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1cb90 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1cba0 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1cbb0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1cbc0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1cbd0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1cbe0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1cbf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1cc00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1cc10 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1cc20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
1cc30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
1cc40 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1cc50 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1cc60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1cc70 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1cc80 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1cc90 0a 20 20 72 63 20 3d 20 62 74 72 65 65 50 72 65  .  rc = btreePre
1cca0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1ccb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ccc0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1ccd0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1cce0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1ccf0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1cd00 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1cd10 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1cd20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1cd30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1cd40 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1cd50 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1cd60 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1cd70 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1cd80 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1cd90 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1cda0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1cdb0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1cdc0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1cdd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1cde0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1cdf0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1ce00 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1ce10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1ce20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1ce30 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1ce40 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1ce50 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1ce60 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1ce70 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1ce80 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1ce90 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1cea0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1ceb0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1cec0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1ced0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1cee0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1cef0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1cf00 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1cf10 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1cf20 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1cf30 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1cf40 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1cf50 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1cf60 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1cf70 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1cf80 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1cf90 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1cfa0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1cfb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cfc0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1cfd0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1cfe0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1cff0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1d000 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1d010 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1d020 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1d030 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1d040 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1d050 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1d060 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1d070 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1d080 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1d090 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1d0a0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1d0b0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1d0c0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1d0d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d0e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d0f0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1d100 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1d110 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1d120 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1d130 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1d140 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1d150 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1d160 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1d170 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d180 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1d190 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1d1a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d1b0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1d1c0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1d1d0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1d1e0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1d1f0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1d200 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1d210 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d220 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d230 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1d240 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1d250 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1d260 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d270 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1d280 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1d290 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1d2a0 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1d2b0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1d2c0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1d2d0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1d2e0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1d2f0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1d300 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1d310 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1d320 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1d330 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1d340 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1d350 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1d360 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1d370 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1d380 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1d390 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1d3a0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1d3b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1d3c0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1d3d0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1d3e0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1d3f0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1d400 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d410 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1d420 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c  t && nearby<=sql
1d430 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1d440 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1d450 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1d460 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1d470 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1d480 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1d490 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1d4a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d4b0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1d4c0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1d4d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1d4e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1d4f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1d500 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1d510 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1d520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d530 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1d540 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1d550 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1d560 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1d570 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1d580 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1d590 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1d5a0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1d5b0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1d5c0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1d5d0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1d5e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d5f0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1d600 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1d610 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d620 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1d630 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1d640 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1d650 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1d660 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1d670 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1d680 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1d690 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1d6a0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1d6b0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1d6c0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1d6d0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1d6e0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1d6f0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1d700 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1d710 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1d720 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1d730 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1d740 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1d750 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1d760 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1d770 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1d780 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1d790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d7a0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1d7b0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d7c0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1d7d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d7e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1d7f0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1d800 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
1d810 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1d820 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1d830 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1d840 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1d850 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1d860 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1d870 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1d880 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1d890 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1d8a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1d8b0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1d8c0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1d8d0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1d8e0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1d8f0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1d900 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1d910 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1d920 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1d930 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1d940 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1d950 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1d960 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1d970 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d980 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1d990 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1d9a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1d9b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1d9c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1d9d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
1d9e0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1d9f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1da00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1da10 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1da20 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1da30 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1da40 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1da50 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1da60 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1da70 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1da80 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1da90 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1daa0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1dab0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1dac0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1dad0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1dae0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1daf0 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1db00 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1db10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1db20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1db30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1db40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
1db50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1db60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1db70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1db80 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
1db90 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
1dba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
1dbb0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
1dbc0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
1dbd0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
1dbe0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
1dbf0 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
1dc00 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1dc10 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
1dc20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1dc30 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1dc40 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
1dc50 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1dc60 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1dc70 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1dc80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dc90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1dca0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1dcb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1dcc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1dcd0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1dce0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1dcf0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1dd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1dd10 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1dd30 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1dd40 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1dd50 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1dd60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dd70 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1dd80 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1dd90 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1dda0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1ddb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ddc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ddd0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1dde0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1ddf0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1de00 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1de10 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1de20 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1de30 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1de40 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1de50 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1de60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1de70 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1de80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1de90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1dea0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1deb0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1dec0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1ded0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1dee0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1def0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1df00 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
1df10 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
1df20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1df30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1df40 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1df50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1df60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1df70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1df80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1df90 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
1dfa0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1dfb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dfc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dfd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1dfe0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1dff0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e000 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e020 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1e030 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1e040 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e050 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1e060 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
1e070 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1e080 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1e090 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1e0a0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
1e0b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
1e0c0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
1e0d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e0e0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1e0f0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1e100 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1e110 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1e120 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e130 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1e140 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e150 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e170 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
1e180 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e190 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1e1b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e1c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1e1d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e1e0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1e1f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1e200 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1e210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e220 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1e230 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1e240 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1e250 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1e260 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1e270 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1e280 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1e290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1e2a0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1e2b0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1e2c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1e2d0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1e2e0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1e2f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e300 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1e310 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1e320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e330 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e340 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e350 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e360 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e370 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e390 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1e3a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1e3b0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1e3c0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1e3d0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1e3e0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1e3f0 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1e400 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1e410 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1e420 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1e430 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1e440 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1e450 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1e460 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1e470 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1e480 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1e490 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1e4a0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1e4b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e4c0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1e4d0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1e4e0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1e4f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1e500 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e510 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1e520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1e530 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1e540 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1e550 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1e560 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1e570 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1e580 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1e590 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1e5a0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1e5b0 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74  if( *pPgno>sqlit
1e5c0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1e5d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1e5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1e5f0 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1e600 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1e610 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1e620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e630 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e650 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e660 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1e670 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1e680 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1e690 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1e6a0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1e6b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e6c0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1e6d0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1e6e0 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1e6f0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1e700 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1e710 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1e720 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1e730 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1e740 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1e750 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1e760 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1e770 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1e780 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e790 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1e7a0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1e7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e7c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e7e0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e7f0 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1e800 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e810 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e820 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1e830 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1e840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1e850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e870 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1e880 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1e890 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e8a0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1e8b0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1e8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e8d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e8e0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1e8f0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1e900 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1e910 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1e920 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1e930 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1e940 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1e950 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1e960 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1e970 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1e980 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e  ile */.    *pPgn
1e990 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
1e9a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1e9b0 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66  Pager) + 1;..#if
1e9c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e9d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1e9e0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1e9f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1ea00 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1ea10 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1ea20 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1ea30 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1ea40 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1ea50 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1ea60 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1ea70 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1ea80 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1ea90 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1eaa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1eab0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1eac0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1ead0 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1eae0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1eaf0 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1eb00 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1eb10 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1eb20 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1eb30 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1eb40 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1eb50 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1eb60 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1eb70 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1eb80 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1eb90 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1eba0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1ebb0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1ebc0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1ebd0 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1ebe0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
1ebf0 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
1ec00 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
1ec10 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
1ec20 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
1ec30 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1ec40 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1ec50 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
1ec60 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
1ec70 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
1ec80 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1ec90 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1eca0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1ecb0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1ecc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1ecd0 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
1ece0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
1ecf0 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65  *pPgno;.    }.#e
1ed00 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
1ed10 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1ed20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ed30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1ed40 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1ed50 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1ed60 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1ed70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1ed80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1ed90 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
1eda0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
1edb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1edc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1edd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
1ede0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
1edf0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1ee00 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
1ee10 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
1ee20 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
1ee30 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1ee40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ee50 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
1ee60 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
1ee70 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
1ee80 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1ee90 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65  PrevTrunk);.  re
1eea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1eeb0 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20  * Add a page of 
1eec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eed0 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
1eee0 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  t..**.** sqlite3
1eef0 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1ef00 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70  NOT called for p
1ef10 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1ef20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
1ef30 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1ef40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ef50 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65  pPage->pBt;.  Me
1ef60 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1ef70 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69  pBt->pPage1;.  i
1ef80 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20  nt rc, n, k;..  
1ef90 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70  /* Prepare the p
1efa0 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  age for freeing 
1efb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1efc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1efd0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1efe0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1eff0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
1f000 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1f010 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1f020 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65  age(pPage->pPare
1f030 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50  nt);.  pPage->pP
1f040 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  arent = 0;..  /*
1f050 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
1f060 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
1f070 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
1f080 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f090 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1f0a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1f0b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1f0c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1f0d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f0e0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
1f0f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1f100 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  n+1);..#ifdef SQ
1f110 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1f120 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
1f130 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1f140 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
1f150 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
1f160 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
1f170 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
1f180 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
1f190 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
1f1a0 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ros..  */.  rc =
1f1b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f1c0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1f1d0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1f1e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73  eturn rc;.  mems
1f1f0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1f200 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
1f210 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
1f220 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1f230 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f240 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1f250 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1f260 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1f270 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1f280 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1f290 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1f2a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1f2b0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1f2c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1f2d0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1f2e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1f2f0 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1f300 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1f310 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1f320 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1f330 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1f340 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1f350 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1f360 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1f370 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f380 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1f390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f3a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d  return rc;.    m
1f3b0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1f3c0 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70  ta, 0, 8);.    p
1f3d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1f3e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1f3f0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52  e->pgno);.    TR
1f400 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1f410 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50   %d first\n", pP
1f420 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
1f430 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
1f440 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c  er free pages al
1f450 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65  ready exist.  Re
1f460 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20  trive the first 
1f470 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a  trunk page.    *
1f480 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  * of the freelis
1f490 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68  t and find out h
1f4a0 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69  ow many leaves i
1f4b0 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  t has. */.    Me
1f4c0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20  mPage *pTrunk;. 
1f4d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f4e0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1f4f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1f500 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26  1->aData[32]), &
1f510 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1f520 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f530 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1f540 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1f550 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1f560 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1f570 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1f580 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1f590 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1f5a0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1f5b0 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1f5c0 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1f5d0 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1f5e0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1f5f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f600 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1f610 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1f620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f630 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f640 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54  pPage->aData, pT
1f650 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  runk->pgno);.   
1f660 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f670 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
1f680 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  0);.        put4
1f690 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1f6a0 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
1f6b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54  pgno);.        T
1f6c0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
1f6d0 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
1f6e0 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
1f6f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f700 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
1f710 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  , pTrunk->pgno))
1f720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1f730 6c 73 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20  lse if( k<0 ){. 
1f740 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f750 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
1f760 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  lse{.      /* Ad
1f770 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65  d the newly free
1f780 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66  d page as a leaf
1f790 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
1f7a0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72  trunk */.      r
1f7b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f7c0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1f7d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
1f7e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f7f0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
1f800 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1f810 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20  ta[4], k+1);.   
1f820 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f830 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b  Trunk->aData[8+k
1f840 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  *4], pPage->pgno
1f850 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1f860 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
1f870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f880 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
1f890 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23  age->pDbPage);.#
1f8a0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
1f8b0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
1f8c0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
1f8d0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
1f8e0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
1f8f0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
1f900 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
1f910 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
1f920 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f930 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
1f940 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1f950 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f960 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
1f970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
1f980 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
1f990 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
1f9a0 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
1f9b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1f9c0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
1f9d0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1f9e0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
1f9f0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
1fa00 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  Ovfl;.  int ovfl
1fa10 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
1fa20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1fa30 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1fa40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1fa50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1fa60 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
1fa70 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1fa80 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1fa90 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
1faa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
1fab0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
1fac0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
1fad0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1fae0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
1faf0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
1fb00 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
1fb10 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66  verflow]);.  ovf
1fb20 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
1fb30 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
1fb40 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
1fb50 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
1fb60 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
1fb70 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
1fb80 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
1fb90 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
1fba0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
1fbb0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
1fbc0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
1fbd0 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76  Ovfl;.    if( ov
1fbe0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66  flPgno==0 || ovf
1fbf0 6c 50 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67  lPgno>sqlite3Pag
1fc00 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1fc10 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1fc20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fc30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fc40 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65    }..    rc = ge
1fc50 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
1fc60 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
1fc70 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f  vfl, (nOvfl==0)?
1fc80 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  0:&ovflPgno);.  
1fc90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1fca0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66  n rc;.    rc = f
1fcb0 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  reePage(pOvfl);.
1fcc0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1fcd0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
1fce0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1fcf0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1fd00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1fd10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fd20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
1fd30 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
1fd40 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
1fd50 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
1fd60 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
1fd70 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
1fd80 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
1fd90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1fda0 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
1fdb0 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
1fdc0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
1fdd0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1fde0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
1fdf0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
1fe00 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
1fe10 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
1fe20 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
1fe30 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
1fe40 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
1fe50 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
1fe60 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
1fe70 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
1fe80 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
1fe90 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
1fea0 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
1feb0 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
1fec0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
1fed0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
1fee0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
1fef0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
1ff00 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
1ff10 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
1ff20 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
1ff30 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
1ff40 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1ff50 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1ff60 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1ff70 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
1ff80 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
1ff90 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
1ffa0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1ffb0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
1ffc0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1ffd0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
1ffe0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
1fff0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
20000 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
20010 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
20020 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
20030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20040 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
20050 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
20060 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
20070 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
20080 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
20090 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
200a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
200b0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
200c0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
200d0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
200e0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
200f0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
20100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
20110 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
20120 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
20130 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
20140 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
20150 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20160 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20170 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
20180 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
20190 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
201a0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
201b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
201c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
201d0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ex) );..  /* Fil
201e0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
201f0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
20200 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
20210 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
20220 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
20230 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
20240 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
20250 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
20260 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
20270 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
20280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
20290 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
202a0 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
202b0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
202c0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
202d0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69  *)&nKey);.  sqli
202e0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
202f0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
20300 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
20310 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
20320 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
20330 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
20340 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
20350 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
20360 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a  =nData+nZero );.
20370 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
20380 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
20390 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
203a0 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
203b0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
203c0 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
203d0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
203e0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
203f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
20400 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    nPayload += nK
20410 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
20420 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
20430 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
20440 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
20450 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
20460 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
20470 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
20480 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
20490 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
204a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
204b0 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
204c0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
204d0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  aceLeft==0 ){.  
204e0 20 20 20 20 69 6e 74 20 69 73 45 78 61 63 74 20      int isExact 
204f0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
20500 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20510 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
20520 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
20530 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
20540 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
20550 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
20560 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
20570 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
20580 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
20590 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
205a0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
205b0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
205c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
205d0 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
205e0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
205f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
20600 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
20610 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20   if( pgnoOvfl>1 
20620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
20630 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a  isExact = 1; */.
20640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20650 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
20660 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
20670 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
20680 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
20690 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74 29  noOvfl, isExact)
206a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
206b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
206c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
206d0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
206e0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
206f0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
20700 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
20710 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
20720 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
20730 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
20740 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
20750 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
20760 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
20770 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
20780 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
20790 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
207a0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
207b0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
207c0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
207d0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
207e0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
207f0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
20800 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
20810 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
20820 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
20830 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
20840 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
20850 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
20860 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
20870 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
20880 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
20890 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
208a0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
208b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
208c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
208d0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
208e0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
208f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20900 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
20910 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
20920 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
20930 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
20940 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
20950 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
20960 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
20970 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
20980 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
20990 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
209a0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
209b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
209c0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
209d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
209e0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
209f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20a00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
20a10 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
20a20 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
20a30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20a40 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
20a50 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
20a60 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
20a70 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
20a80 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
20a90 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
20aa0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
20ab0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
20ac0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
20ad0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
20ae0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
20af0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
20b00 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
20b10 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
20b20 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  eft;.    if( nSr
20b30 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
20b40 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
20b50 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
20b60 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
20b70 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
20b80 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
20b90 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
20ba0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
20bb0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
20bc0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
20bd0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
20be0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
20bf0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
20c00 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
20c10 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
20c20 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
20c30 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
20c40 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
20c50 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
20c60 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
20c70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20c80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
20c90 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67  hange the MemPag
20ca0 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e.pParent pointe
20cb0 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68  r on the page wh
20cc0 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ose number is.**
20cd0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
20ce0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f  cond argument so
20cf0 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50   that MemPage.pP
20d00 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a  arent holds the.
20d10 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
20d20 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
20d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20d40 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53  reparentPage(BtS
20d50 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
20d60 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
20d70 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20  pNewParent, int 
20d80 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  idx){.  MemPage 
20d90 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65  *pThis;.  DbPage
20da0 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
20db0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20dc0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
20dd0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20de0 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20  ( pNewParent!=0 
20df0 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
20e00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20e10 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
20e20 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
20e30 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
20e40 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
20e50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
20e60 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
20e70 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d  e ){.    pThis =
20e80 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
20e90 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
20ea0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
20eb0 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74  f( pThis->isInit
20ec0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20ed0 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d  ( pThis->aData==
20ee0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
20ef0 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
20f00 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
20f10 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61  >pParent!=pNewPa
20f20 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
20f30 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
20f40 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  nt ) sqlite3Page
20f50 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50  rUnref(pThis->pP
20f60 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
20f70 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
20f80 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
20f90 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
20fa0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e  lite3PagerRef(pN
20fb0 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  ewParent->pDbPag
20fc0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
20fd0 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
20fe0 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
20ff0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21000 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
21010 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
21020 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21030 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
21040 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
21050 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
21060 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52  t(pBt, pgno, PTR
21070 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50  MAP_BTREE, pNewP
21080 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
21090 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
210a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
210b0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
210c0 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
210d0 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  er of all childr
210e0 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70  en of pPage to p
210f0 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  oint back.** to 
21100 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pPage..**.** In 
21110 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72  other words, for
21120 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20   every child of 
21130 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65  pPage, invoke re
21140 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20  parentPage().** 
21150 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
21160 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f  t each child kno
21170 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73  ws that pPage is
21180 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   its parent..**.
21190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
211a0 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65  gets called afte
211b0 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f  r you memcpy() o
211c0 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20  ne page into.** 
211d0 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  another..*/.stat
211e0 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
211f0 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
21200 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
21210 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   i;.  BtShared *
21220 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
21230 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21240 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
21250 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21260 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
21270 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
21280 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20  ( pPage->leaf ) 
21290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
212a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
212b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
212c0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
212d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
212e0 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ge, i);.    if( 
212f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
21300 20 20 20 20 20 20 72 63 20 3d 20 72 65 70 61 72        rc = repar
21310 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
21320 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
21330 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
21340 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21350 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21360 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70    }.  }.  if( !p
21370 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
21380 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
21390 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
213a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
213b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
213c0 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 70 50  +8]), .       pP
213d0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 50 61  age, i);.    pPa
213e0 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
213f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21400 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  c;.}../*.** Remo
21410 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
21420 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
21430 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
21440 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
21450 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
21460 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
21470 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
21480 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
21490 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
214a0 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
214b0 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
214c0 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
214d0 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
214e0 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
214f0 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
21500 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
21510 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
21520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
21530 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
21540 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
21550 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
21560 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
21570 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20   int sz){.  int 
21580 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
21590 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
215a0 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
215b0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
215c0 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
215d0 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
215e0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
215f0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
21600 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
21610 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
21620 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
21630 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
21640 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
21650 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
21660 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
21670 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
21680 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
21690 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
216a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
216b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
216c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
216d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
216e0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
216f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
21700 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
21710 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
21720 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
21730 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
21740 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
21750 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74 28  (ptr);.  assert(
21760 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c   pc>10 && pc+sz<
21770 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
21780 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72 65  bleSize );.  fre
21790 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
217a0 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69  , sz);.  for(i=i
217b0 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
217c0 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
217d0 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
217e0 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
217f0 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
21800 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
21810 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
21820 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
21830 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
21840 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
21850 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
21860 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
21870 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 1;.}../*.** In
21880 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
21890 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
218a0 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
218b0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
218c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
218d0 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
218e0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
218f0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
21900 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
21910 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
21920 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
21930 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
21940 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
21950 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
21960 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
21970 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
21980 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
21990 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
219a0 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
219b0 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
219c0 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
219d0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
219e0 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
219f0 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
21a00 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
21a10 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
21a20 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
21a30 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
21a40 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
21a50 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
21a60 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
21a70 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
21a80 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
21a90 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
21aa0 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
21ab0 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
21ac0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
21ad0 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
21ae0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
21af0 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
21b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
21b10 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
21b20 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
21b30 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
21b40 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
21b50 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
21b60 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
21b70 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
21b80 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
21b90 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
21ba0 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
21bb0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
21bc0 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
21bd0 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
21be0 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
21bf0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
21c00 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
21c10 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
21c20 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
21c30 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
21c40 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
21c50 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
21c60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
21c70 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
21c80 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
21c90 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
21ca0 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
21cb0 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
21cc0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
21cd0 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20  u8 nSkip        
21ce0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74    /* Do not writ
21cf0 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  e the first nSki
21d00 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  p bytes of the c
21d10 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ell */.){.  int 
21d20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
21d30 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
21d40 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
21d50 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
21d60 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
21d70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21d80 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  r */.  int top; 
21d90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
21da0 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e  t byte of conten
21db0 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69  t for any cell i
21dc0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
21dd0 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
21de0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
21df0 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
21e00 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
21e10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
21e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
21e30 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
21e40 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
21e50 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
21e60 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
21e70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
21e80 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20   into data[] of 
21e90 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
21ea0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
21eb0 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
21ec0 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
21ed0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
21ee0 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
21ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21f00 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
21f10 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
21f20 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
21f30 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
21f40 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
21f50 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
21f60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
21f70 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
21f80 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
21f90 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
21fa0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
21fb0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
21fc0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
21fd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21fe0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21ff0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
22000 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
22010 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
22020 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
22030 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
22040 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
22050 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
22060 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
22070 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
22080 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
22090 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
220a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
220b0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
220c0 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
220d0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a  e->aOvfl[0]) );.
220e0 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
220f0 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  [j].pCell = pCel
22100 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  l;.    pPage->aO
22110 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a  vfl[j].idx = i;.
22120 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
22130 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22140 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
22150 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
22160 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
22170 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
22190 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
221a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
221b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
221c0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
221d0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
221e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
221f0 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
22200 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
22210 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
22220 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
22230 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
22240 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
22250 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
22260 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
22270 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
22280 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
22290 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
222a0 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
222b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66  {.      rc = def
222c0 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
222d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
222e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
222f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 74  turn rc;.      t
22300 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
22310 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
22320 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b     assert( end +
22330 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20   sz <= top );.  
22340 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c    }.    idx = al
22350 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
22360 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65  e, sz);.    asse
22370 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20  rt( idx>0 );.   
22380 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20   assert( end <= 
22390 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
223a0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70 50  dr+5]) );.    pP
223b0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
223c0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
223d0 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 2;.    memcpy(
223e0 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
223f0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
22400 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f  z-nSkip);.    fo
22410 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26  r(j=end-2, ptr=&
22420 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20  data[j]; j>ins; 
22430 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20  j-=2, ptr-=2){. 
22440 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74       ptr[0] = pt
22450 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
22460 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20  [1] = ptr[-1];. 
22470 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74     }.    put2byt
22480 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64  e(&data[ins], id
22490 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  x);.    put2byte
224a0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
224b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
224c0 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
224d0 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  t = 1;.#ifndef S
224e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
224f0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
22500 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
22510 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
22520 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
22530 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
22540 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
22550 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
22560 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
22570 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
22580 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
22590 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
225a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
225b0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
225c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
225d0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
225e0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
225f0 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
22600 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
22610 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
22620 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
22630 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  .nPayload );.   
22640 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
22650 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
22660 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
22670 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
22680 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f         Pgno pgno
22690 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
226a0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
226b0 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
226c0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
226d0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f  pPage->pBt, pgno
226e0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
226f0 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
22700 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
22710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22720 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22730 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
22740 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  f.  }..  return 
22750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22760 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f  .** Add a list o
22770 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67  f cells to a pag
22780 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f  e.  The page sho
22790 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79  uld be initially
227a0 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63   empty..** The c
227b0 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74  ells are guarant
227c0 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  eed to fit on th
227d0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
227e0 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50  c void assembleP
227f0 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
22800 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20  pPage,   /* The 
22810 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d  page to be assem
22820 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  blied */.  int n
22830 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
22840 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  The number of ce
22850 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68  lls to add to th
22860 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
22870 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f  **apCell,      /
22880 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65  * Pointers to ce
22890 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69  ll bodies */.  i
228a0 6e 74 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20  nt *aSize       
228b0 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65   /* Sizes of the
228c0 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
228d0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
228e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
228f0 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53   */.  int totalS
22900 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ize;    /* Total
22910 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
22920 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ls */.  int hdr;
22930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
22940 65 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ex of page heade
22950 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70  r */.  int cellp
22960 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tr;      /* Addr
22970 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
22980 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
22990 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
229a0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
229b0 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
229c0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
229d0 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
229e0 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61  the page */..  a
229f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
22a00 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
22a10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22a20 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
22a30 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
22a40 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30  .  totalSize = 0
22a50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
22a60 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
22a70 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69  totalSize += aSi
22a80 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  ze[i];.  }.  ass
22a90 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32  ert( totalSize+2
22aa0 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e  *nCell<=pPage->n
22ab0 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Free );.  assert
22ac0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
22ad0 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d  0 );.  cellptr =
22ae0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
22af0 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
22b00 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
22b10 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
22b20 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28  set;.  put2byte(
22b30 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
22b40 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  ell);.  if( nCel
22b50 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  l ){.    cellbod
22b60 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  y = allocateSpac
22b70 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69  e(pPage, totalSi
22b80 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ze);.    assert(
22b90 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20   cellbody>0 );. 
22ba0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22bb0 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65  ->nFree >= 2*nCe
22bc0 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll );.    pPage-
22bd0 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c  >nFree -= 2*nCel
22be0 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  l;.    for(i=0; 
22bf0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
22c00 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
22c10 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65  ata[cellptr], ce
22c20 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d  llbody);.      m
22c30 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
22c40 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
22c50 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20  , aSize[i]);.   
22c60 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b     cellptr += 2;
22c70 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  .      cellbody 
22c80 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20  += aSize[i];.   
22c90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
22ca0 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e  ellbody==pPage->
22cb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
22cc0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
22cd0 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d  nCell = nCell;.}
22ce0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
22cf0 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
22d00 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
22d10 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
22d20 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
22d30 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
22d40 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
22d50 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
22d60 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
22d70 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
22d80 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
22d90 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
22da0 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
22db0 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
22dc0 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
22dd0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
22de0 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
22df0 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
22e00 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
22e10 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
22e20 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
22e30 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
22e40 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
22e50 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
22e60 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
22e70 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
22e80 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
22e90 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
22ea0 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
22eb0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
22ec0 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
22ed0 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
22ee0 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
22ef0 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
22f00 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
22f10 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
22f20 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
22f30 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
22f40 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
22f50 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
22f60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
22f70 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
22f80 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
22f90 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
22fa0 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
22fb0 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
22fc0 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
22fd0 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  e */../* Forward
22fe0 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
22ff0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
23000 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b  (MemPage*, int);
23010 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23020 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
23030 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
23040 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
23050 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
23060 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
23070 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
23080 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
23090 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
230a0 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
230b0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
230c0 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
230d0 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
230e0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
230f0 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
23100 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
23110 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
23120 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61  d of trying bala
23130 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
23140 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
23150 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
23160 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
23170 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
23180 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
23190 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
231a0 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
231b0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
231c0 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
231d0 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
231e0 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
231f0 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
23200 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
23210 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
23220 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
23230 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
23240 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
23250 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
23260 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
23270 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
23280 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
23290 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
232a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
232b0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
232c0 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
232d0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
232e0 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
232f0 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
23300 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
23310 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
23320 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
23330 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
23340 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
23350 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
23360 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ge, MemPage *pPa
23370 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rent){.  int rc;
23380 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
23390 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  ;.  Pgno pgnoNew
233a0 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  ;.  u8 *pCell;. 
233b0 20 69 6e 74 20 73 7a 43 65 6c 6c 3b 0a 20 20 43   int szCell;.  C
233c0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
233d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
233e0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
233f0 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50  t parentIdx = pP
23400 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20  arent->nCell;   
23410 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64  /* pParent new d
23420 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65  ivider cell inde
23430 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  x */.  int paren
23440 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
23450 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
23460 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20   of new divider 
23470 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72  cell */.  u8 par
23480 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20  entCell[64];    
23490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
234a0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
234b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
234c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
234d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
234e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
234f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
23500 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
23510 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
23520 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
23530 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
23540 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
23550 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
23560 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
23570 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
23580 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
23590 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
235a0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
235b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
235c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
235d0 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  pCell = pPage
235e0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
235f0 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  ;.  szCell = cel
23600 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
23610 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61  pCell);.  zeroPa
23620 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e  ge(pNew, pPage->
23630 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73  aData[0]);.  ass
23640 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
23650 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
23660 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ll);.  pPage->nO
23670 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
23680 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72 65 6e  /* Set the paren
23690 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20 61  t of the newly a
236a0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74 6f  llocated page to
236b0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70   pParent. */.  p
236c0 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
236d0 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65  Parent;.  sqlite
236e0 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
236f0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
23700 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72 72  /* pPage is curr
23710 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d  ently the right-
23720 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
23730 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20  . Change this.  
23740 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ** so that the r
23750 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68  ight-child is th
23760 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63  e new page alloc
23770 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20  ated above and. 
23780 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65   ** pPage is the
23790 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63   next-to-right c
237a0 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73  hild. .  */.  as
237b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
237c0 6c 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20  ll>0 );.  pCell 
237d0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
237e0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
237f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
23800 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
23810 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
23820 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  o);.  rc = fillI
23830 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
23840 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e  arentCell, 0, in
23850 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
23860 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a  , &parentSize);.
23870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23880 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
23890 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
238a0 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36  rt( parentSize<6
238b0 34 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65  4 );.  rc = inse
238c0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
238d0 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e  parentIdx, paren
238e0 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a  tCell, parentSiz
238f0 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28 20  e, 0, 4);.  if( 
23900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23910 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23920 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 66    }.  put4byte(f
23930 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
23940 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64  pParent,parentId
23950 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  x), pPage->pgno)
23960 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
23970 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
23980 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
23990 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23  8], pgnoNew);..#
239a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
239b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
239c0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
239d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
239e0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
239f0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
23a00 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
23a10 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
23a20 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
23a30 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a  r from the .  **
23a40 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
23a50 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
23a60 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
23a70 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
23a80 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
23a90 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
23aa0 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
23ab0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
23ac0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
23ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23ae0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
23af0 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a  tOvfl(pNew, 0);.
23b00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23b20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23b30 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  (pNew);.      re
23b40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23b50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
23b60 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
23b70 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
23b80 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63   page and balanc
23b90 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
23ba0 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  e,.  ** in case 
23bb0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
23bc0 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64   inserted caused
23bd0 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76   it to become ov
23be0 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72  erfull..  */.  r
23bf0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
23c00 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e  ;.  return balan
23c10 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  ce(pParent, 0);.
23c20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
23c30 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
23c40 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ANCE */../*.** T
23c50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
23c60 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20  stributes Cells 
23c70 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  on pPage and up 
23c80 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73  to NN*2 siblings
23c90 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20  .** of pPage so 
23ca0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
23cb0 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73 61  ave about the sa
23cc0 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65  me amount of fre
23cd0 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61  e space..** Usua
23ce0 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  lly NN siblings 
23cf0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
23d00 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64 20  f pPage is used 
23d10 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
23d20 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65  ,.** though more
23d30 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
23d40 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69  come from one si
23d50 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20 74  de if pPage is t
23d60 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c  he first.** or l
23d70 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
23d80 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61   parent.  If pPa
23d90 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ge has fewer tha
23da0 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a  n 2*NN siblings.
23db0 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  ** (something wh
23dc0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
23dd0 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73 20  pen if pPage is 
23de0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  the root page or
23df0 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20   a .** child of 
23e00 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61  root) then all a
23e10 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67  vailable sibling
23e20 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  s participate in
23e30 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
23e40 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
23e50 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
23e60 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 69  pPage might be i
23e70 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
23e80 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a  eased by one or.
23e90 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  ** two in an eff
23ea0 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
23eb0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
23ec0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
23ed0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   The root page.*
23ee0 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64  * is special and
23ef0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
23f00 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
23f10 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20  If pPage is .** 
23f20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  the root page, t
23f30 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66  hen the depth of
23f40 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74 20   the tree might 
23f50 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20  be increased.** 
23f60 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
23f70 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72  one, as necessar
23f80 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72  y, to keep the r
23f90 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65  oot page from be
23fa0 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20  ing.** overfull 
23fb0 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  or completely em
23fc0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  pty..**.** Note 
23fd0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
23fe0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
23ff0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65  , some of the Ce
24000 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20  lls on pPage.** 
24010 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
24020 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
24030 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20  pPage->aData[]. 
24040 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
24050 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
24060 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61  is overfull.  Pa
24070 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66  rt of the job of
24080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24090 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65   to.** make sure
240a0 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70   all Cells for p
240b0 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20  Page once again 
240c0 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  fit in pPage->aD
240d0 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ata[]..**.** In 
240e0 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
240f0 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c  lancing the sibl
24100 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74  ings of pPage, t
24110 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
24120 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f  ge.** might beco
24130 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
24140 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68  nderfull.  If th
24150 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e  at happens, then
24160 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
24170 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
24180 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61  sively on the pa
24190 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rent..**.** If t
241a0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
241b0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
241c0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
241d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
241e0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
241f0 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68  state.  So if th
24200 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
24210 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
24220 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
24230 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
24240 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
24250 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a  onroot(MemPage *
24260 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
24270 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
24280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
24290 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f  rent of pPage */
242a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
242b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
242c0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
242d0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
242e0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
242f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24300 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
24310 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
24320 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
24330 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
24340 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
24350 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
24360 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rom. */.  int nO
24370 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
24380 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24390 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
243a0 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ld[] */.  int nN
243b0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
243c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
243d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
243e0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ew[] */.  int nD
243f0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
24400 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24410 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44   of cells in apD
24420 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  iv[] */.  int i,
24430 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
24440 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
24450 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
24460 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
24470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
24480 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70  ex of pPage in p
24490 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
244a0 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244c0 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
244d0 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
244e0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
244f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24510 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
24520 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72  */.  int leafCor
24530 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
24540 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
24550 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
24560 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
24570 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
24580 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
24590 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
245a0 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
245b0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
245c0 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
245d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
245e0 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
245f0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
24600 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24620 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
24630 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
24640 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
24650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
24660 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
24670 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
24680 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
24690 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
246a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
246b0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
246c0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  Space[] */.  Mem
246d0 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
246e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
246f0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
24700 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
24710 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
24720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24730 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
24740 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
24750 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
24760 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
24770 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
24780 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
24790 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
247a0 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
247b0 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
247c0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
247d0 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
247e0 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
247f0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
24800 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
24810 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
24820 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
24830 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
24840 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
24850 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
24860 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
24870 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
24880 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
24890 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
248a0 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
248b0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
248c0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
248d0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
248e0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
248f0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
24900 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
24910 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
24920 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
24930 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
24940 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
24950 2f 0a 20 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b  /.  int *szCell;
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
24980 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
24990 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
249a0 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
249b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
249c0 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64  ce for holding d
249d0 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20  ata of apCopy[] 
249e0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 3b  */.  u8 *aSpace;
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
24a10 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  ld copies of div
24a20 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 23  iders cells */.#
24a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24a40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24a50 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23  u8 *aFrom = 0;.#
24a60 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
24a70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24a80 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
24a90 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
24aa0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70  .  ** Find the p
24ab0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f  arent page..  */
24ac0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24ad0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
24ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
24af0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
24b00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c  age->pDbPage) ||
24b10 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24b20 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20  w==1 );.  pBt = 
24b30 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
24b40 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
24b50 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
24b60 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
24b70 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
24b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24b90 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
24ba0 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
24bb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24bc0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
24bd0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
24be0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
24bf0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
24c00 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
24c10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24c20 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
24c30 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
24c40 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
24c50 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
24c60 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
24c70 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
24c80 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
24c90 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
24ca0 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
24cb0 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
24cc0 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
24cd0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
24ce0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
24cf0 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
24d00 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
24d10 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
24d20 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
24d30 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
24d40 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
24d50 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
24d60 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
24d70 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
24d80 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
24d90 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
24da0 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
24db0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
24dc0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
24dd0 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
24de0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
24df0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61        pPage->lea
24e00 66 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70  fData &&.      p
24e10 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
24e20 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  =1 &&.      pPag
24e30 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
24e40 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  =pPage->nCell &&
24e50 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
24e60 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
24e70 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
24e80 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
24e90 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
24ea0 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
24eb0 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  pgno.  ){.    /*
24ec0 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68  .    ** TODO: Ch
24ed0 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73  eck the siblings
24ee0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
24ef0 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65  pPage. It may be
24f00 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
24f10 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61  y are not full a
24f20 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69  nd no new page i
24f30 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
24f40 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61  */.    return ba
24f50 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67  lance_quick(pPag
24f60 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d  e, pParent);.  }
24f70 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53  .#endif..  if( S
24f80 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
24f90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24fa0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
24fb0 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
24fc0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   rc;.  }..  /*. 
24fd0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c   ** Find the cel
24fe0 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  l in the parent 
24ff0 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20  page whose left 
25000 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63  child points bac
25010 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e  k.  ** to pPage.
25020 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69    The "idx" vari
25030 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65  able is the inde
25040 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20  x of that cell. 
25050 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69   If pPage.  ** i
25060 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  s the rightmost 
25070 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
25080 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f   then set idx to
25090 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
250a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
250b0 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b  ent->idxShift ){
250c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
250d0 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65      pgno = pPage
250e0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
250f0 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  rt( pgno==sqlite
25100 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
25110 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25120 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d   );.    for(idx=
25130 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  0; idx<pParent->
25140 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20  nCell; idx++){. 
25150 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
25160 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
25170 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20  nt, idx))==pgno 
25180 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
25190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
251a0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
251b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20  pParent->nCell. 
251c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67              || g
251d0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
251e0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
251f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
25200 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno );.  }else{
25210 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65  .    idx = pPage
25220 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d  ->idxParent;.  }
25230 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74  ..  /*.  ** Init
25240 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73  ialize variables
25250 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
25260 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70   be safe to jump
25270 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74  .  ** directly t
25280 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
25290 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e  p at any moment.
252a0 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e  .  */.  nOld = n
252b0 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  New = 0;.  sqlit
252c0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
252d0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20  nt->pDbPage);.. 
252e0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69   /*.  ** Find si
252f0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70  bling pages to p
25300 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c  Page and the cel
25310 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68  ls in pParent th
25320 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74  at divide.  ** t
25330 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e  he siblings.  An
25340 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
25350 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c   to find NN sibl
25360 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20  ings on either. 
25370 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67   ** side of pPag
25380 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67  e.  More sibling
25390 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
253a0 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76   one side, howev
253b0 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67  er, if.  ** pPag
253c0 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  e there are fewe
253d0 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
253e0 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
253f0 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e  side.  If pParen
25400 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
25410 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
25420 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
25430 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
25440 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e   taken..  */.  n
25450 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b  xDiv = idx - NN;
25460 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e  .  if( nxDiv + N
25470 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  B > pParent->nCe
25480 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  ll ){.    nxDiv 
25490 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
254a0 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20   - NB + 1;.  }. 
254b0 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a   if( nxDiv<0 ){.
254c0 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
254d0 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20   }.  nDiv = 0;. 
254e0 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69   for(i=0, k=nxDi
254f0 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b  v; i<NB; i++, k+
25500 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50  +){.    if( k<pP
25510 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
25520 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
25530 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
25540 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69  t, k);.      nDi
25550 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  v++;.      asser
25560 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61  t( !pParent->lea
25570 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  f );.      pgnoO
25580 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
25590 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
255a0 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61  }else if( k==pPa
255b0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
255c0 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
255d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  = get4byte(&pPar
255e0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
255f0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
25600 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25610 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25620 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
25630 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
25640 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64  noOld[i], &apOld
25650 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  [i], pParent);. 
25660 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
25670 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
25680 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e  ;.    apOld[i]->
25690 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20  idxParent = k;. 
256a0 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30     apCopy[i] = 0
256b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  ;.    assert( i=
256c0 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c  =nOld );.    nOl
256d0 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c  d++;.    nMaxCel
256e0 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
256f0 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
25700 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d  ->nOverflow;.  }
25710 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
25720 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
25730 20 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74   of 2 in order t
25740 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
25750 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
25760 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
25770 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31  = (nMaxCells + 1
25780 29 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~1;..  /*.  **
25790 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
257a0 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
257b0 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43  tures.  */.  apC
257c0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
257d0 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 20 6e 4d  lloc( .       nM
257e0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
257f0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25810 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
25820 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
25830 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20 20  of(int)         
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25850 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
25860 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a      + ROUND8(siz
25870 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e 42  eof(MemPage))*NB
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20 2a        /* aCopy *
258a0 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
258b0 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20 20  geSize*(5+NB)   
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
258e0 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  ce */.     + (IS
258f0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
25900 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20 20  xCells : 0)     
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25920 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20  aFrom */.  );.  
25930 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
25940 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
25950 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
25960 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
25970 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
25980 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b 6e   (int*)&apCell[n
25990 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
259a0 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
259b0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
259c0 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
259d0 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[0] - (u8*)apC
259e0 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
259f0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
25a00 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
25a10 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b    for(i=1; i<NB;
25a20 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79   i++){.    aCopy
25a30 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31  [i] = &aCopy[i-1
25a40 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
25a50 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
25a60 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73  mPage))];.    as
25a70 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d  sert( ((aCopy[i]
25a80 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20   - (u8*)apCell) 
25a90 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
25aa0 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
25ab0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
25ac0 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70 79   aSpace = &aCopy
25ad0 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
25ae0 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
25af0 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
25b00 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
25b10 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  e - (u8*)apCell)
25b20 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
25b30 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
25b40 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e  required */.#ifn
25b50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25b60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
25b70 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25b80 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20   ){.    aFrom = 
25b90 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70  &aSpace[5*pBt->p
25ba0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65  ageSize];.  }.#e
25bb0 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  ndif.  .  /*.  *
25bc0 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
25bd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
25be0 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
25bf0 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
25c00 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
25c10 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
25c20 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
25c30 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
25c40 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
25c50 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
25c60 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
25c70 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
25c80 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
25c90 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
25ca0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
25cb0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
25cc0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
25cd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
25ce0 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
25cf0 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20  age*)aCopy[i];. 
25d00 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f     memcpy(p, apO
25d10 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
25d20 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e  mPage));.    p->
25d30 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
25d40 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  p[1];.    memcpy
25d50 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  (p->aData, apOld
25d60 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
25d70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
25d80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
25d90 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
25da0 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
25db0 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
25dc0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
25dd0 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
25de0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
25df0 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
25e00 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
25e10 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
25e20 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d  ce obtained form
25e30 20 61 53 70 61 63 65 5b 5d 20 61 6e 64 20 72 65   aSpace[] and re
25e40 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76  move the the div
25e50 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20  ider Cells.  ** 
25e60 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
25e70 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
25e80 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
25e90 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
25ea0 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
25eb0 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
25ec0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
25ed0 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
25ee0 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
25ef0 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
25f00 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
25f10 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
25f20 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
25f30 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
25f40 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
25f50 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
25f60 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
25f70 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
25f80 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
25f90 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
25fa0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
25fb0 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
25fc0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
25fd0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
25fe0 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
25ff0 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
26000 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
26010 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
26020 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
26030 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
26040 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
26050 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
26060 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
26070 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
26080 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61  nCell = 0;.  lea
26090 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50  fCorrection = pP
260a0 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  age->leaf*4;.  l
260b0 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d  eafData = pPage-
260c0 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70 50 61  >leafData && pPa
260d0 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28  ge->leaf;.  for(
260e0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
260f0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
26100 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
26110 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20  ;.    int limit 
26120 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
26130 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
26140 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
26150 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
26160 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
26170 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
26180 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
26190 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
261a0 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
261b0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
261c0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
261d0 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
261e0 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l]);.#ifndef SQL
261f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
26200 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
26210 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
26220 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a  .        int a;.
26230 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
26240 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  ell] = i;.      
26250 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c    for(a=0; a<pOl
26260 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b  d->nOverflow; a+
26270 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
26280 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d  ( pOld->aOvfl[a]
26290 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e  .pCell==apCell[n
262a0 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  Cell] ){.       
262b0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
262c0 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
262d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
262e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
262f0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
26300 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  f.      nCell++;
26310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
26320 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20  <nOld-1 ){.     
26330 20 69 6e 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69   int sz = cellSi
26340 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
26350 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
26360 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
26370 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20          /* With 
26380 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61  the LEAFDATA fla
26390 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73  g, pParent cells
263a0 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45   hold only INTKE
263b0 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  Ys that.        
263c0 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ** are duplicate
263d0 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65  s of keys on the
263e0 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57   child pages.  W
263f0 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65  e need to remove
26400 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26410 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
26420 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20  om pParent, but 
26430 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65 6c  the dividers cel
26440 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20  ls are not.     
26450 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61     ** added to a
26460 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20  pCell[] because 
26470 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63 61  they are duplica
26480 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c  tes of child cel
26490 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
264a0 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
264b0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
264c0 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sz);.      }else
264d0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 54  {.        u8 *pT
264e0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  emp;.        ass
264f0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
26500 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
26510 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
26520 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  sz;.        pTem
26530 70 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61  p = &aSpace[iSpa
26540 63 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70  ce];.        iSp
26550 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
26560 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
26570 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
26580 2a 35 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  *5 );.        me
26590 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
265a0 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
265b0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
265c0 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
265d0 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66  rection;.#ifndef
265e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
265f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
26600 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26610 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
26620 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
26630 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
26640 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64  #endif.        d
26650 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
26660 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
26670 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
26680 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63  l] -= leafCorrec
26690 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  tion;.        as
266a0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70  sert( get4byte(p
266b0 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69  Temp)==pgnoOld[i
266c0 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ] );.        if(
266d0 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
266e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
266f0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
26700 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
26710 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
26720 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
26730 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
26740 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
26750 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
26760 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
26770 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
26780 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
26790 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
267a0 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72  >aData[pOld->hdr
267b0 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20  Offset+8], 4);. 
267c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
267d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
267e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
267f0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  4 );.          i
26800 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
26810 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
26820 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
26830 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
26840 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
26850 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
26860 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
26870 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
26880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26890 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
268a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
268b0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
268c0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
268d0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
268e0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
268f0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
26900 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
26910 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
26920 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
26930 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
26940 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
26950 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
26960 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
26970 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
26980 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
26990 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
269a0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
269b0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
269c0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
269d0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
269e0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
269f0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
26a00 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
26a10 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
26a20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
26a30 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
26a40 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
26a50 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
26a60 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
26a70 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
26a80 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
26a90 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
26aa0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
26ab0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
26ac0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
26ad0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
26ae0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
26af0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
26b00 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
26b10 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
26b20 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
26b30 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
26b40 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
26b50 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
26b60 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
26b70 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
26b80 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
26b90 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
26ba0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
26bb0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
26bc0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
26bd0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
26be0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
26bf0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
26c00 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
26c10 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
26c20 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
26c30 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
26c40 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
26c50 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
26c60 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
26c70 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
26c80 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
26c90 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
26ca0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
26cb0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
26cc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
26cd0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
26ce0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
26cf0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
26d00 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
26d10 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
26d20 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
26d30 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
26d40 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
26d50 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
26d60 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
26d70 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
26d80 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
26d90 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
26da0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
26db0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
26dc0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
26dd0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
26de0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
26df0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
26e00 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
26e10 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
26e20 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
26e30 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
26e40 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
26e50 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
26e60 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
26e70 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
26e80 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
26e90 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
26ea0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
26eb0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
26ec0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
26ed0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
26ee0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
26ef0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
26f00 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
26f10 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
26f20 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
26f30 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
26f40 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
26f50 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
26f60 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
26f70 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
26f80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
26f90 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
26fa0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
26fb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26fd0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
26fe0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
26ff0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
27000 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
27010 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
27020 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
27030 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
27040 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
27050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
27060 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27070 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
27080 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
27090 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
270a0 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
270b0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
270c0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
270d0 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
270e0 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
270f0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
27100 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
27110 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
27120 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
27130 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
27140 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
27150 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
27160 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
27170 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
27180 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
27190 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
271a0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
271b0 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20  or we are the.  
271c0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
271d0 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
271e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
271f0 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
27200 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
27210 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
27220 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
27230 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
27240 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
27250 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
27260 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
27270 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
27280 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ==0) );..  /*.  
27290 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
272a0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
272b0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
272c0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
272d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
272e0 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65  pgno>1 );.  page
272f0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61  Flags = pPage->a
27300 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
27310 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
27320 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
27330 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
27340 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
27350 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
27360 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  d[i];.      pgno
27370 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64  New[i] = pgnoOld
27380 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
27390 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
273a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
273b0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
273c0 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
273d0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
273e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
273f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
27400 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
27410 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
27420 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
27430 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
27440 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70  , &pgnoNew[i], p
27450 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b  gnoNew[i-1], 0);
27460 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27470 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
27480 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
27490 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
274a0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d     nNew++;.    }
274b0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
274c0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
274d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
274e0 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
274f0 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
27500 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
27510 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
27520 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  nOld ){.    rc =
27530 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
27540 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
27550 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
27560 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
27570 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
27580 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
27590 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
275a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
275b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
275c0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
275d0 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
275e0 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
275f0 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
27600 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
27610 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
27620 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
27630 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
27640 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
27650 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
27660 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
27670 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
27680 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
27690 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
276a0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
276b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
276c0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
276d0 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
276e0 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
276f0 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
27700 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
27710 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
27720 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
27730 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
27740 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
27750 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
27760 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
27770 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
27780 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
27790 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
277a0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
277b0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
277c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
277d0 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
277e0 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e  int minV = pgnoN
277f0 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d  ew[i];.    int m
27800 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
27810 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
27820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
27830 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65  oNew[j]<(unsigne
27840 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
27850 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
27860 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e      minV = pgnoN
27870 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  ew[j];.      }. 
27880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
27890 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
278a0 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
278b0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
278c0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
278d0 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
278e0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
278f0 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e  i] = pgnoNew[min
27900 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
27910 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
27920 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
27930 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20  minI] = t;.     
27940 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
27950 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
27960 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
27970 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e  old: %d %d %d  n
27980 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
27990 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
279a0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70  %d(%d)\n",.    p
279b0 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20  gnoOld[0], .    
279c0 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c  nOld>=2 ? pgnoOl
279d0 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  d[1] : 0,.    nO
279e0 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=3 ? pgnoOld[
279f0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f  2] : 0,.    pgno
27a00 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d  New[0], szNew[0]
27a10 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
27a20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20  pgnoNew[1] : 0, 
27a30 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
27a40 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
27a50 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d  >=3 ? pgnoNew[2]
27a60 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
27a70 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
27a80 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f    nNew>=4 ? pgno
27a90 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[3] : 0, nNew
27aa0 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
27ab0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
27ac0 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30  ? pgnoNew[4] : 0
27ad0 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
27ae0 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f  w[4] : 0));..  /
27af0 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
27b00 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
27b10 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
27b20 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
27b30 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
27b40 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
27b50 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
27b60 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
27b70 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
27b80 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
27b90 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
27ba0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
27bb0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
27bc0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
27bd0 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
27be0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
27bf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
27c00 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65  ew->pgno==pgnoNe
27c10 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  w[i] );.    asse
27c20 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
27c30 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
27c40 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
27c50 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
27c60 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
27c70 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
27c80 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
27c90 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
27ca0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
27cb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27cc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27cd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
27ce0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
27cf0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
27d00 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
27d10 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
27d20 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
27d30 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61  the siblings tha
27d40 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65  t were rearrange
27d50 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a  d. These can be:
27d60 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69   left.    ** chi
27d70 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20  ldren of cells, 
27d80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
27d90 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
27da0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
27db0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f     ** pointed to
27dc0 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a   by cells..    *
27dd0 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  /.    if( pBt->a
27de0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
27df0 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e     for(k=j; k<cn
27e00 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  tNew[i]; k++){. 
27e10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
27e20 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27e30 20 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b        if( aFrom[
27e40 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  k]==0xFF || apCo
27e50 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67  py[aFrom[k]]->pg
27e60 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
27e70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27e80 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
27e90 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20  New, k-j);.     
27ea0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27ec0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
27ed0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27ef0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27f00 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20  #endif..    j = 
27f10 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
27f20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
27f30 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
27f40 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
27f50 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
27f60 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
27f70 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
27f80 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
27f90 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
27fa0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
27fb0 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
27fc0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
27fd0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
27fe0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
27ff0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
28000 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
28010 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
28020 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
28030 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
28040 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
28050 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
28060 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
28070 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
28080 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
28090 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
280a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
280b0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
280c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
280d0 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
280e0 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
280f0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
28100 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
28110 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
28120 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
28130 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
28140 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
28150 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
28160 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
28170 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
28180 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
28190 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
281a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
281b0 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
281c0 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
281d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
281e0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
281f0 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
28200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
28210 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28220 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
28230 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
28240 20 20 70 43 65 6c 6c 20 3d 20 26 61 53 70 61 63    pCell = &aSpac
28250 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  e[iSpace];.     
28260 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50     fillInCell(pP
28270 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c  arent, pCell, 0,
28280 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30   info.nKey, 0, 0
28290 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  , 0, &sz);.     
282a0 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b     iSpace += sz;
282b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
282c0 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61   iSpace<=pBt->pa
282d0 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20  geSize*5 );.    
282e0 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
282f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28300 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
28310 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
28320 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d 3b  &aSpace[iSpace];
28330 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 20  .        iSpace 
28340 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
28350 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d 70  ssert( iSpace<=p
28360 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 29  Bt->pageSize*5 )
28370 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
28380 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
28390 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
283a0 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
283b0 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
283c0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
283d0 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
283e0 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
283f0 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
28400 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
28410 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
28420 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
28430 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
28440 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
28450 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
28460 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
28470 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
28480 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
28490 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
284a0 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
284b0 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
284c0 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
284d0 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
284e0 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
284f0 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
28500 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
28510 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
28520 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
28530 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
28540 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
28550 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
28560 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
28570 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
28580 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
28590 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
285a0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
285b0 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
285c0 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
285d0 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
285e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
285f0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
28600 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
28610 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
28620 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
28630 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
28640 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
28650 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
28660 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
28670 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
28680 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
28690 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
286a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 4);.      if( 
286b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
286c0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
286d0 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34  anup;.      put4
286e0 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
286f0 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78  wCell(pParent,nx
28700 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Div), pNew->pgno
28710 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
28720 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28730 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
28740 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
28750 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61  cuum database, a
28760 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61  nd not a leaf-da
28770 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a  ta tree,.      *
28780 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68  * then update th
28790 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69  e pointer map wi
287a0 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  th an entry for 
287b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
287c0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  e.      ** that 
287d0 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e  the cell just in
287e0 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f  serted points to
287f0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20   (if any)..     
28800 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
28810 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
28820 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20   !leafData ){.  
28830 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28840 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74  pPutOvfl(pParent
28850 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20  , nxDiv);.      
28860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28870 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28880 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28890 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
288a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
288b0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
288c0 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
288d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
288e0 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
288f0 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
28900 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
28910 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
28920 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
28930 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0 ){.    memcpy(
28940 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
28950 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43 6f 70  aData[8], &apCop
28960 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
28970 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69  [8], 4);.  }.  i
28980 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e  f( nxDiv==pParen
28990 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74  t->nCell+pParent
289a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
289b0 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74     /* Right-most
289c0 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20   sibling is the 
289d0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
289e0 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   of pParent */. 
289f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
28a00 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
28a10 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
28a20 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ], pgnoNew[nNew-
28a30 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1]);.  }else{.  
28a40 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
28a50 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c  sibling is the l
28a60 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65  eft child of the
28a70 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
28a80 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  pParent.    ** p
28a90 61 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ast the right-mo
28aa0 73 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79  st divider entry
28ab0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
28ac0 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
28ad0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
28ae0 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ), pgnoNew[nNew-
28af0 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  1]);.  }..  /*. 
28b00 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69   ** Reparent chi
28b10 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c  ldren of all cel
28b20 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
28b30 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
28b40 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  {.    rc = repar
28b50 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 61 70  entChildPages(ap
28b60 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  New[i]);.    if(
28b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28b80 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28b90 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20  eanup;.  }.  rc 
28ba0 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
28bb0 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b 0a 20  ages(pParent);. 
28bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28bd0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
28be0 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a  e_cleanup;..  /*
28bf0 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68  .  ** Balance th
28c00 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20  e parent page.  
28c10 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 75  Note that the cu
28c20 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 67  rrent page (pPag
28c30 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61  e) might.  ** ha
28c40 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f  ve been added to
28c50 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f   the freelist so
28c60 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e   it might no lon
28c70 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ger be initializ
28c80 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  ed..  ** But the
28c90 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c   parent page wil
28ca0 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74  l always be init
28cb0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
28cc0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
28cd0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 72 63 20  >isInit );.  rc 
28ce0 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e  = balance(pParen
28cf0 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20  t, 0);.  .  /*. 
28d00 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f   ** Cleanup befo
28d10 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20  re returning..  
28d20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  */.balance_clean
28d30 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  up:.  sqlite3_fr
28d40 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
28d50 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
28d60 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
28d70 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
28d80 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
28d90 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
28da0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
28db0 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  ew[i]);.  }.  re
28dc0 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
28dd0 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41  t);.  TRACE(("BA
28de0 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20  LANCE: finished 
28df0 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20  with %d: old=%d 
28e00 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
28e10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50  n",.          pP
28e20 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c  age->pgno, nOld,
28e30 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
28e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28e50 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28e60 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
28e70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
28e80 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
28e90 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
28ea0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
28eb0 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
28ec0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
28ed0 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
28ee0 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
28ef0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
28f00 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
28f10 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a  llower(MemPage *
28f20 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
28f30 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
28f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
28f50 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
28f60 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
28f70 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
28f80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
28f90 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
28fa0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
28fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
28fc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28fd0 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
28fe0 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
28ff0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
29000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29010 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
29020 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
29030 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
29040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
29050 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
29060 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
29070 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
290a0 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
290b0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
290c0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
290d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
290e0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
290f0 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
29100 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
29110 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29120 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
29130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29140 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29150 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
29160 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ex) );.  pBt = p
29170 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43  Page->pBt;.  mxC
29180 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f  ellPerPage = MX_
29190 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43  CELL(pBt);.  apC
291a0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ell = sqlite3_ma
291b0 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50  lloc( mxCellPerP
291c0 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29  age*(sizeof(u8*)
291d0 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 20 29 3b  +sizeof(int)) );
291e0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
291f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29200 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c  _NOMEM;.  szCell
29210 20 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c   = (int*)&apCell
29220 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b  [mxCellPerPage];
29230 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
29240 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  af ){.    /* The
29250 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
29260 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20  tely empty */.  
29270 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
29280 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25  E: empty table %
29290 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
292a0 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o));.  }else{.  
292b0 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
292c0 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20  ge is empty but 
292d0 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20  has one child.  
292e0 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20  Transfer the.   
292f0 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
29300 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68  from that one ch
29310 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f  ild into the roo
29320 74 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20  t page if it .  
29330 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20    ** will fit.  
29340 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
29350 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
29360 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ee by one..    *
29370 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
29380 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67  root page is pag
29390 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73  e 1, it has less
293a0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
293b0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73   than.    ** its
293c0 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74   child (due to t
293d0 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64  he 100 byte head
293e0 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  er that occurs a
293f0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
29400 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
29410 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20  tabase fle), so 
29420 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  it might not be 
29430 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  able to hold all
29440 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
29450 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72  information curr
29460 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ently contained 
29470 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49  in the child.  I
29480 66 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20  f this is the . 
29490 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e     ** case, then
294a0 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74   do not do the t
294b0 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20  ransfer.  Leave 
294c0 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63  page 1 empty exc
294d0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ept.    ** for t
294e0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
294f0 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61   to the child pa
29500 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70  ge.  The child p
29510 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20  age becomes.    
29520 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  ** the virtual r
29530 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
29540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f  .    */.    pgno
29550 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
29560 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
29570 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
29580 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
29590 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
295a0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
295b0 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65 33 50 61  Child<=sqlite3Pa
295c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
295d0 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
295e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
295f0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
29600 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
29610 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c  oChild, &pChild,
29620 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
29630 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
29640 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
29650 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  if( pPage->pgno=
29660 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
29670 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
29680 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50  tPage(pChild, pP
29690 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
296a0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
296b0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
296c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68       assert( pCh
296d0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ild->nOverflow==
296e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
296f0 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30  Child->nFree>=10
29700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
29710 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d  The child inform
29720 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f  ation will fit o
29730 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  n the root page,
29740 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20   so do the.     
29750 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20     ** copy */.  
29760 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29770 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50       zeroPage(pP
29780 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
29790 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[0]);.        
297a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c  for(i=0; i<pChil
297b0 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  d->nCell; i++){.
297c0 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c            apCell
297d0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
297e0 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20  Child,i);.      
297f0 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20      szCell[i] = 
29800 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69  cellSizePtr(pChi
29810 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a  ld, apCell[i]);.
29820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29830 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
29840 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43  Page, pChild->nC
29850 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43  ell, apCell, szC
29860 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ell);.        /*
29870 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d   Copy the right-
29880 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
29890 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65  hild to the pare
298a0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  nt. */.        p
298b0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
298c0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
298d0 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20  Offset+8], .    
298e0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
298f0 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  (&pChild->aData[
29900 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65  pChild->hdrOffse
29910 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  t+8]));.        
29920 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
29930 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
29940 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
29950 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20   %d transfer to 
29960 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
29970 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
29980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29990 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73  /* The child has
299a0 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
299b0 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  n that will fit 
299c0 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20  on the root..   
299d0 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65       ** The tree
299e0 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61   is already bala
299f0 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e  nced.  Do nothin
29a00 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52  g. */.        TR
29a10 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
29a20 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74  hild %d will not
29a30 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e   fit on page 1\n
29a40 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
29a50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63  else{.      memc
29a70 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  py(pPage->aData,
29a80 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20   pChild->aData, 
29a90 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
29aa0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  leSize);.      p
29ab0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
29ac0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
29ad0 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Parent = 0;.    
29ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29af0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
29b00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  e, 0);.      ass
29b10 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
29b20 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65  OK );.      free
29b30 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
29b40 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
29b50 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68  NCE: transfer ch
29b60 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74  ild %d into root
29b70 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
29b80 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67        pChild->pg
29b90 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  no, pPage->pgno)
29ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
29bb0 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
29bc0 61 67 65 73 28 70 50 61 67 65 29 3b 0a 20 20 20  ages(pPage);.   
29bd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29be0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
29bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29c00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29c10 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
29c20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
29c30 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
29c40 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
29c50 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  Cell; i++){ .   
29c60 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29c70 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69  PutOvfl(pPage, i
29c80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29c90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29ca0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29cb0 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
29cc0 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
29cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
29ce0 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  if.    releasePa
29cf0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
29d00 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
29d10 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  nce:.  sqlite3_f
29d20 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
29d30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
29d40 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
29d50 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
29d60 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
29d70 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
29d80 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
29d90 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
29da0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
29db0 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
29dc0 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
29dd0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
29de0 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
29df0 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
29e00 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
29e10 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
29e20 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
29e30 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
29e40 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
29e50 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
29e60 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
29e70 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
29e80 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
29e90 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29eb0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
29ec0 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
29ed0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
29ee0 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  hild;    /* Poin
29ef0 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
29f00 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
29f10 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
29f20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29f30 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
29f40 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
29f50 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
29f60 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a    /* The BTree *
29f70 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
29f80 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ze;     /* Total
29f90 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   usable size of 
29fa0 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  a page */.  u8 *
29fb0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
29fc0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
29fd0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a 2f  e parent page */
29fe0 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20 20  .  u8 *cdata;   
29ff0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2a000 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  t of the child p
2a010 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  age */.  int hdr
2a020 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a030 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68  Offset to page h
2a040 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74 20  eader in parent 
2a050 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20 20  */.  int brk;   
2a060 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2a070 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66  et to content of
2a080 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 70   first cell in p
2a090 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  arent */..  asse
2a0a0 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  rt( pPage->pPare
2a0b0 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
2a0c0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2a0d0 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d  low>0 );.  pBt =
2a0e0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61   pPage->pBt;.  a
2a0f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a100 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2a110 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2a120 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2a130 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c 20  e(pBt, &pChild, 
2a140 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67  &pgnoChild, pPag
2a150 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69  e->pgno, 0);.  i
2a160 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2a170 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
2a180 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2a190 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
2a1a0 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62 6c  Page) );.  usabl
2a1b0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2a1c0 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 20  bleSize;.  data 
2a1d0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2a1e0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2a1f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 62 72 6b 20  drOffset;.  brk 
2a200 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
2a210 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74  [hdr+5]);.  cdat
2a220 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  a = pChild->aDat
2a230 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64 61 74  a;.  memcpy(cdat
2a240 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c 20 70  a, &data[hdr], p
2a250 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2a260 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  +2*pPage->nCell-
2a270 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  hdr);.  memcpy(&
2a280 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74  cdata[brk], &dat
2a290 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
2a2a0 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73 73 65 72  ze-brk);.  asser
2a2b0 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69  t( pChild->isIni
2a2c0 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  t==0 );.  rc = s
2a2d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2a2e0 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67  age(pChild, pPag
2a2f0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2a300 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65  oto balancedeepe
2a310 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28  r_out;.  memcpy(
2a320 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
2a330 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61  Page->aOvfl, pPa
2a340 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69  ge->nOverflow*si
2a350 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2a360 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64  l[0]));.  pChild
2a370 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50  ->nOverflow = pP
2a380 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  age->nOverflow;.
2a390 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f    if( pChild->nO
2a3a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70  verflow ){.    p
2a3b0 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30  Child->nFree = 0
2a3c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2a3d0 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
2a3e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2a3f0 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2a400 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2a410 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
2a420 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2a430 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2a440 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2a450 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54 52 41 43  noChild);.  TRAC
2a460 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
2a470 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
2a480 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2a490 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
2a4a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2a4b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2a4c0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
2a4d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 69  oVacuum ){.    i
2a4e0 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d 20 70  nt i;.    rc = p
2a4f0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43  trmapPut(pBt, pC
2a500 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  hild->pgno, PTRM
2a510 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d  AP_BTREE, pPage-
2a520 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
2a530 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2a540 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20  edeeper_out;.   
2a550 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69   for(i=0; i<pChi
2a560 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ld->nCell; i++){
2a570 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2a580 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69 6c 64  apPutOvfl(pChild
2a590 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
2a5a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a5b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a5c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a5d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
2a5e0 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2a5f0 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61  oot(pChild);..ba
2a600 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a  lancedeeper_out:
2a610 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2a620 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e  Child);.  return
2a630 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
2a640 63 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  cide if the page
2a650 20 70 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20   pPage needs to 
2a660 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66  be balanced.  If
2a670 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a   balancing is.**
2a680 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20   required, call 
2a690 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2a6a0 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  balancing routin
2a6b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a6c0 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65   balance(MemPage
2a6d0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73   *pPage, int ins
2a6e0 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ert){.  int rc =
2a6f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2a700 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a710 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2a720 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a730 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
2a740 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ent==0 ){.    rc
2a750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2a760 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2a770 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2a780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2a790 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2a7a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2a7b0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
2a7c0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2a7d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a7e0 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  OK && pPage->nCe
2a7f0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ll==0 ){.      r
2a800 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  c = balance_shal
2a810 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20  lower(pPage);.  
2a820 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2a830 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2a840 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20  rflow>0 || .    
2a850 20 20 20 20 28 21 69 6e 73 65 72 74 20 26 26 20      (!insert && 
2a860 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61  pPage->nFree>pPa
2a870 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2a880 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20  ize*2/3) ){.    
2a890 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2a8a0 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20  onroot(pPage);. 
2a8b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a8c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2a8d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
2a8e0 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74  ks all cursors t
2a8f0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62  hat point to tab
2a900 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20  le pgnoRoot..** 
2a910 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  If any of those 
2a920 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65  cursors were ope
2a930 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
2a940 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  =0 in a differen
2a950 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
2a960 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61  nnection (a data
2a970 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2a980 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65 20  that shares the 
2a990 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77  pager.** cache w
2a9a0 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
2a9b0 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20  connection) and 
2a9c0 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65  that other conne
2a9d0 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74  ction .** is not
2a9e0 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f   in the ReadUnco
2a9f0 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20  mmmitted state, 
2aa00 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2aa10 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  e returns .** SQ
2aa20 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a  LITE_LOCKED..**.
2aa30 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  ** In addition t
2aa40 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 72  o checking for r
2aa50 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65  ead-locks (where
2aa60 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a   a read-lock .**
2aa70 20 6d 65 61 6e 73 20 61 20 63 75 72 73 6f 72 20   means a cursor 
2aa80 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
2aa90 61 67 3d 3d 30 29 20 74 68 69 73 20 72 6f 75 74  ag==0) this rout
2aaa0 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a  ine also moves.*
2aab0 2a 20 61 6c 6c 20 77 72 69 74 65 20 63 75 72 73  * all write curs
2aac0 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ors so that they
2aad0 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f   are pointing to
2aae0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 43   the .** first C
2aaf0 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ell on the root 
2ab00 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6e  page.  This is n
2ab10 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
2ab20 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f   an insert .** o
2ab30 72 20 64 65 6c 65 74 65 20 6d 69 67 68 74 20 63  r delete might c
2ab40 68 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72  hange the number
2ab50 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70   of cells on a p
2ab60 61 67 65 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a  age or delete.**
2ab70 20 61 20 70 61 67 65 20 65 6e 74 69 72 65 6c 79   a page entirely
2ab80 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 20 77   and we do not w
2ab90 61 6e 74 20 74 6f 20 6c 65 61 76 65 20 61 6e 79  ant to leave any
2aba0 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69   cursors .** poi
2abb0 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69  nting to non-exi
2abc0 73 74 61 6e 74 20 70 61 67 65 73 20 6f 72 20 63  stant pages or c
2abd0 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
2abe0 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  int checkReadLoc
2abf0 6b 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ks(Btree *pBtree
2ac00 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c  , Pgno pgnoRoot,
2ac10 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c   BtCursor *pExcl
2ac20 75 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ude){.  BtCursor
2ac30 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
2ac40 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
2ac50 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
2ac60 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a  b = pBtree->db;.
2ac70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ac80 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2ac90 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
2aca0 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
2acb0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
2acc0 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78  {.    if( p==pEx
2acd0 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65  clude ) continue
2ace0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74  ;.    if( p->eSt
2acf0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ad00 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  D ) continue;.  
2ad10 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
2ad20 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f  t!=pgnoRoot ) co
2ad30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2ad40 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a  p->wrFlag==0 ){.
2ad50 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2ad60 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
2ad70 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66  ee->db;.      if
2ad80 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a  ( dbOther==0 ||.
2ad90 20 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65           (dbOthe
2ada0 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
2adb0 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
2adc0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2add0 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
2ade0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2adf0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
2ae00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
2ae10 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d  >pPage->pgno!=p-
2ae20 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  >pgnoRoot ){.   
2ae30 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29     moveToRoot(p)
2ae40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2ae50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ae60 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2ae70 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
2ae80 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
2ae90 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
2aea0 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
2aeb0 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
2aec0 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
2aed0 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
2aee0 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
2aef0 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
2af00 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
2af10 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
2af20 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
2af30 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
2af40 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2af50 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
2af60 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
2af70 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
2af80 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
2af90 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
2afa0 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
2afb0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
2afc0 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
2afd0 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
2afe0 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
2aff0 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
2b000 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
2b010 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rt(.  BtCursor *
2b020 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
2b030 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
2b040 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ata into the tab
2b050 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f  le of this curso
2b060 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  r */.  const voi
2b070 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2b080 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2b090 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2b0a0 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
2b0b0 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
2b0c0 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61  Data,  /* The da
2b0d0 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ta of the new re
2b0e0 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  cord */.  int nZ
2b0f0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
2b100 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b110 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79  er of extra 0 by
2b120 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
2b130 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61   data */.  int a
2b140 70 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20  ppendBias       
2b150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b160 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
2b170 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f  ely an append */
2b180 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2b190 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73  int loc;.  int s
2b1a0 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20  zNew;.  MemPage 
2b1b0 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
2b1c0 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
2b1d0 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
2b1e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
2b1f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
2b200 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
2b210 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
2b220 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
2b230 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2b240 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
2b250 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
2b260 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on!=TRANS_WRITE 
2b270 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73  ){.    /* Must s
2b280 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
2b290 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20  on before doing 
2b2a0 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  an insert */.   
2b2b0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2b2c0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2b2d0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2b2e0 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2b2f0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2b300 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2b310 79 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72  y );.  if( !pCur
2b320 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2b330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2b340 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  RM;   /* Cursor 
2b350 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69  not open for wri
2b360 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ting */.  }.  if
2b370 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  ( checkReadLocks
2b380 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
2b390 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2b3a0 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Cur) ){.    retu
2b3b0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2b3c0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2b3d0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2b3e0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2b3f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
2b400 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b410 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
2b420 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
2b430 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
2b440 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
2b450 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
2b460 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
2b470 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43  able */.  clearC
2b480 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2b490 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20  ur);.  if( .    
2b4a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2b4b0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2b4c0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2b4d0 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20  oot, pCur)) ||. 
2b4e0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2b4f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b500 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
2b510 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
2b520 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  ias, &loc)).  ){
2b530 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b540 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2b550 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2b560 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2b570 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
2b580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b590 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
2b5a0 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20  e->leafData );. 
2b5b0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
2b5c0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
2b5d0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
2b5e0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
2b5f0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2b600 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
2b610 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
2b620 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
2b630 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
2b640 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
2b650 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b660 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 6e 65 77  >isInit );.  new
2b670 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cell = sqlite3_m
2b680 61 6c 6c 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53  alloc( MX_CELL_S
2b690 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66  IZE(pBt) );.  if
2b6a0 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
2b6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b6c0 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
2b6d0 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
2b6e0 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
2b6f0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
2b700 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
2b710 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2b720 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
2b730 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
2b740 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2b750 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
2b760 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
2b770 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
2b780 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26  ;.  if( loc==0 &
2b790 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  & CURSOR_VALID==
2b7a0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2b7b0 20 20 20 20 69 6e 74 20 73 7a 4f 6c 64 3b 0a 20      int szOld;. 
2b7c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b7d0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
2b7e0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
2b7f0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
2b800 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b810 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2b820 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2b830 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
2b840 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
2b850 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
2b860 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2b870 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
2b880 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b890 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
2b8a0 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
2b8b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
2b8c0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b8d0 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
2b8e0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2b8f0 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
2b900 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2b910 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2b920 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70  ;.    dropCell(p
2b930 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2b940 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65   szOld);.  }else
2b950 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
2b960 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
2b970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b980 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70  e->leaf );.    p
2b990 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20  Cur->idx++;.    
2b9a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b9b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
2b9c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b9d0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
2b9e0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2b9f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2ba00 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
2ba10 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2ba20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2ba30 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2ba40 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2ba50 50 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73  Page, 1);.  /* s
2ba60 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
2ba70 75 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70  ump(pCur->pBt, p
2ba80 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31  Cur->pgnoRoot, 1
2ba90 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73  ); */.  /* fflus
2baa0 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
2bab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bac0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2bad0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65  oot(pCur);.  }.e
2bae0 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c  nd_insert:.  sql
2baf0 69 74 65 33 5f 66 72 65 65 28 6e 65 77 43 65 6c  ite3_free(newCel
2bb00 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2bb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2bb20 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2bb30 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
2bb40 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
2bb50 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
2bb60 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2bb70 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
2bb80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2bb90 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72  treeDelete(BtCur
2bba0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2bbb0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2bbc0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e  Cur->pPage;.  un
2bbd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2bbe0 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ll;.  int rc;.  
2bbf0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
2bc00 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d   0;.  Btree *p =
2bc10 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
2bc20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2bc30 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
2bc40 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2bc50 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2bc60 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2bc70 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70  sInit );.  if( p
2bc80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2bc90 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
2bca0 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
2bcb0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2bcc0 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
2bcd0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72   delete */.    r
2bce0 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2bcf0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2bd00 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2bd10 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OR;.    return r
2bd20 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2bd30 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2bd40 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2bd50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
2bd60 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
2bd70 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
2bd80 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64  }.  if( pCur->id
2bd90 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  x >= pPage->nCel
2bda0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
2bdb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
2bdc0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  * The cursor is 
2bdd0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
2bde0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
2bdf0 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46    if( !pCur->wrF
2be00 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
2be10 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20  n SQLITE_PERM;  
2be20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e   /* Did not open
2be30 20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72   this cursor for
2be40 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2be50 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2be60 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2be70 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2be80 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20  t, pCur) ){.    
2be90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2bea0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2beb0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2bec0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2bed0 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  k */.  }..  /* R
2bee0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
2bef0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2bf00 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
2bf10 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2bf20 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
2bf30 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2bf40 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
2bf50 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2bf60 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2bf70 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
2bf80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
2bf90 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
2bfa0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
2bfb0 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
2bfc0 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
2bfd0 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2bfe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2bff0 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f    (rc = restoreO
2c000 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2c010 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c  tion(pCur))!=0 |
2c020 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65  |.    (rc = save
2c030 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2c040 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2c050 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20  pCur))!=0 ||.   
2c060 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
2c070 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2c080 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29  pDbPage))!=0.  )
2c090 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2c0a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
2c0b0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  e the cell withi
2c0c0 6e 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c  n its page and l
2c0d0 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74  eave pCell point
2c0e0 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ing to the.  ** 
2c0f0 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43  data. The clearC
2c100 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73  ell() call frees
2c110 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2c120 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2c130 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ith the.  ** cel
2c140 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65  l. The cell itse
2c150 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61  lf is still inta
2c160 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c  ct..  */.  pCell
2c170 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2c180 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2c190 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2c1a0 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
2c1b0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
2c1c0 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
2c1d0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2c1e0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
2c1f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2c200 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
2c210 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2c220 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
2c230 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
2c240 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
2c250 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
2c260 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
2c270 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
2c280 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
2c290 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
2c2a0 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
2c2b0 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
2c2c0 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
2c2d0 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
2c2e0 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
2c2f0 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
2c300 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
2c310 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
2c320 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
2c330 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
2c340 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
2c350 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
2c360 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
2c370 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
2c380 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2c390 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f  Next;.    int no
2c3a0 74 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67  tUsed;.    unsig
2c3b0 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65  ned char *tempCe
2c3c0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ll = 0;.    asse
2c3d0 72 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  rt( !pPage->leaf
2c3e0 44 61 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  Data );.    sqli
2c3f0 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
2c400 75 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61  ursor(pCur, &lea
2c410 66 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  fCur);.    rc = 
2c420 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2c430 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
2c440 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sed);.    if( rc
2c450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c460 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c470 33 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66  3PagerWrite(leaf
2c480 43 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61  Cur.pPage->pDbPa
2c490 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2c4a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c4b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
2c4c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43  Next;.      TRAC
2c4d0 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2c4e0 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
2c4f0 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
2c500 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
2c510 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
2c520 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c530 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66  Page->pgno, leaf
2c540 43 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29  Cur.pPage->pgno)
2c550 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  );.      dropCel
2c560 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2c570 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2c580 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2c590 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69        pNext = fi
2c5a0 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  ndCell(leafCur.p
2c5b0 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2c5c0 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74  x);.      szNext
2c5d0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c   = cellSizePtr(l
2c5e0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e  eafCur.pPage, pN
2c5f0 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
2c600 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
2c610 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
2c620 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c  );.      tempCel
2c630 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  l = sqlite3_mall
2c640 6f 63 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  oc( MX_CELL_SIZE
2c650 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 69  (pBt) );.      i
2c660 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2c670 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2c680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c690 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2c6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c6b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73          rc = ins
2c6c0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2c6d0 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
2c6e0 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
2c6f0 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  pCell, 0);.     
2c700 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
2c710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c720 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2c730 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2c740 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2c750 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ), pgnoChild);. 
2c760 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
2c770 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2c780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c7a0 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  {.        dropCe
2c7b0 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2c7c0 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2c7d0 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
2c7e0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
2c7f0 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
2c800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c810 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 74    sqlite3_free(t
2c820 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 73 71  empCell);.    sq
2c830 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
2c840 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
2c850 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
2c860 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
2c870 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
2c880 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
2c890 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
2c8a0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2c8b0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64  e->pgno));.    d
2c8c0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2c8d0 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2c8e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2c8f0 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ll));.    rc = b
2c900 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2c910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2c920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c930 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2c940 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
2c960 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
2c970 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
2c980 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
2c990 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
2c9a0 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2c9b0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2c9c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
2c9d0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
2c9e0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
2c9f0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
2ca00 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
2ca10 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
2ca20 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
2ca30 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
2ca40 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
2ca50 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
2ca60 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
2ca70 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
2ca80 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
2ca90 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
2caa0 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
2cab0 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
2cac0 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
2cae0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
2caf0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
2cb00 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
2cb10 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2cb20 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2cb30 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
2cb40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2cb50 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
2cb60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
2cb70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
2cb80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2cb90 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2cba0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
2cbb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2cbc0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2cbd0 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2cbe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2cbf0 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  st */.    rc = p
2cc00 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2cc10 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2cc20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2cc30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cc40 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2cc50 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
2cc60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2cc70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
2cc80 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2cc90 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
2cca0 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
2ccb0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
2ccc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2ccd0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
2cce0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2ccf0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2cd00 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
2cd10 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
2cd20 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2cd30 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
2cd40 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2cd50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
2cd60 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
2cd70 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
2cd80 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
2cd90 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
2cda0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
2cdb0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
2cdc0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
2cdd0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
2cde0 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
2cdf0 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
2ce00 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
2ce10 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
2ce20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
2ce30 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
2ce40 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
2ce50 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
2ce60 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
2ce70 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
2ce80 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
2ce90 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
2cea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
2ceb0 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
2cec0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2ced0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2cee0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
2cef0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2cf00 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
2cf10 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
2cf20 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2cf30 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
2cf40 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
2cf50 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2cf60 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
2cf70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2cf80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2cf90 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f  Meta(p, 4, &pgno
2cfa0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
2cfb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cfc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2cfd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52  .    }.    pgnoR
2cfe0 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
2cff0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2d000 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
2d010 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
2d020 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
2d030 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
2d040 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
2d050 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
2d060 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41  oRoot==PTRMAP_PA
2d070 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f  GENO(pBt, pgnoRo
2d080 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70  ot) ||.        p
2d090 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47  gnoRoot==PENDING
2d0a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2d0b0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  ){.      pgnoRoo
2d0c0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t++;.    }.    a
2d0d0 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e  ssert( pgnoRoot>
2d0e0 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  =3 );..    /* Al
2d0f0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54  locate a page. T
2d100 68 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72  he page that cur
2d110 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61  rently resides a
2d120 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a  t pgnoRoot will.
2d130 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20      ** be moved 
2d140 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2d150 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68   page (unless th
2d160 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2d170 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20   happens.    ** 
2d180 74 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e  to reside at pgn
2d190 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20  oRoot)..    */. 
2d1a0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2d1b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2d1c0 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f  pPageMove, &pgno
2d1d0 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  Move, pgnoRoot, 
2d1e0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
2d1f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d200 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d210 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e    }..    if( pgn
2d220 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20  oMove!=pgnoRoot 
2d230 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f  ){.      /* pgno
2d240 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65  Root is the page
2d250 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
2d260 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ed for the root-
2d270 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  page of.      **
2d280 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28   the new table (
2d290 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f  assuming an erro
2d2a0 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29  r did not occur)
2d2b0 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20  . But we were.  
2d2c0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2d2d0 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65   pgnoMove. If re
2d2e0 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20  quired (i.e. if 
2d2f0 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63  it was not alloc
2d300 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79  ated.      ** by
2d310 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66   extending the f
2d320 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e  ile), the curren
2d330 74 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69  t page at positi
2d340 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20  on pgnoMove.    
2d350 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
2d360 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20  journaled..     
2d370 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79   */.      u8 eTy
2d380 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
2d390 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  PtrPage;..      
2d3a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2d3b0 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f  eMove);..      /
2d3c0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
2d3d0 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e  currently at pgn
2d3e0 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76  oRoot to pgnoMov
2d3f0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
2d400 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2d410 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
2d420 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
2d430 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2d440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d450 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d460 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2d470 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2d480 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65  pgnoRoot, &eType
2d490 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
2d4a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d4b0 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d  TE_OK || eType==
2d4c0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2d4d0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
2d4e0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2d4f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d500 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2d510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d520 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2d530 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
2d540 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20  ROOTPAGE );.    
2d550 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21    assert( eType!
2d560 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2d570 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
2d580 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d590 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2d5a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d5c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d5d0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20  (pRoot);.       
2d5e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d5f0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72    }.      rc = r
2d600 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
2d610 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69   pRoot, eType, i
2d620 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76  PtrPage, pgnoMov
2d630 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e);.      releas
2d640 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
2d650 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
2d660 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
2d670 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
2d680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d690 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d6a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2d6b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2d6c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2d6d0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2d6e0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2d6f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d700 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d710 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2d720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d730 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2d740 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2d750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2d770 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2d780 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d790 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2d7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
2d7b0 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
2d7c0 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
2d7d0 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
2d7e0 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
2d7f0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
2d800 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
2d810 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
2d820 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2d830 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
2d840 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
2d850 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d860 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d870 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2d880 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2d890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2d8a0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
2d8b0 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
2d8c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d8d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2d8e0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2d8f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2d900 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2d910 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2d920 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2d930 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2d940 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2d950 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2d960 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
2d970 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d980 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
2d990 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
2d9a0 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
2d9b0 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2d9c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d9d0 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
2d9e0 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
2d9f0 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
2da00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2da10 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
2da20 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
2da30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2da40 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2da50 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
2da60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2da70 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
2da80 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
2da90 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54  c = btreeCreateT
2daa0 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c  able(p, piTable,
2dab0 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74   flags);.  sqlit
2dac0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2dad0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dae0 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
2daf0 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
2db00 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
2db10 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
2db20 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
2db30 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
2db40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2db50 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2db60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2db70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2db80 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
2db90 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
2dba0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2dbc0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
2dbd0 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ear */.  MemPage
2dbe0 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
2dbf0 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20  * Parent page.  
2dc00 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f  NULL for the roo
2dc10 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  t */.  int freeP
2dc20 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20  ageFlag      /* 
2dc30 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
2dc40 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2dc50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2dc60 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
2dc70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2dc80 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
2dc90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2dca0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2dcb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2dcc0 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61  ( pgno>sqlite3Pa
2dcd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
2dce0 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
2dcf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2dd00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2dd10 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
2dd20 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2dd30 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65  o, &pPage, pPare
2dd40 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
2dd50 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2dd60 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f  sepage_out;.  fo
2dd70 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
2dd80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2dd90 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2dda0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
2ddb0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2ddc0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2ddd0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2dde0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2ddf0 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70  pCell), pPage->p
2de00 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20  Parent, 1);.    
2de10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2de20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2de30 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2de40 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2de50 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2de60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2de70 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2de80 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66  ge_out;.  }.  if
2de90 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2dea0 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  {.    rc = clear
2deb0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2dec0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2ded0 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50  e->aData[8]), pP
2dee0 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29  age->pParent, 1)
2def0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2df00 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2df10 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2df20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61   if( freePageFla
2df30 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  g ){.    rc = fr
2df40 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2df50 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
2df60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2df70 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2df80 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65  e))==0 ){.    ze
2df90 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  roPage(pPage, pP
2dfa0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20  age->aData[0] | 
2dfb0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a  PTF_LEAF);.  }..
2dfc0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2dfd0 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65  e_out:.  release
2dfe0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
2dff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e000 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  ** Delete all in
2e010 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
2e020 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
2e030 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2e040 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65  iTable is.** the
2e050 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2e060 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2e070 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68  table.  After th
2e080 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2e090 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  ns,.** the root 
2e0a0 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62  page is empty, b
2e0b0 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  ut still exists.
2e0c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2e0d0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2e0e0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2e0f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2e100 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63  y open.** read c
2e110 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
2e120 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65  ble.  Open write
2e130 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76   cursors are mov
2e140 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f  ed to the.** roo
2e150 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
2e160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2e170 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
2e180 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2e190 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
2e1a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2e1b0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
2e1c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2e1d0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
2e1e0 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  db;.  if( p->inT
2e1f0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
2e200 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42  E ){.    rc = pB
2e210 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2e220 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2e230 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2e240 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2e250 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2e260 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 21 3d 53  , iTable, 0))!=S
2e270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e280 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
2e290 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
2e2a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2e2b0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2e2c0 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
2e2d0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
2e2e0 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
2e2f0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
2e300 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2e310 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
2e320 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
2e330 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2e340 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2e350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  c;.}../*.** Eras
2e360 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
2e370 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64  n in a table and
2e380 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   add the root of
2e390 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a   the table to.**
2e3a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2e3b0 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74  Except, the root
2e3c0 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c   of the principl
2e3d0 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65  e table (the one
2e3e0 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69   on.** page 1) i
2e3f0 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
2e400 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2e410 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e420 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  e will fail with
2e430 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
2e440 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2e450 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20  open.** cursors 
2e460 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  on the table..**
2e470 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55  .** If AUTOVACUU
2e480 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64  M is enabled and
2e490 20 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61   the page at iTa
2e4a0 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  ble is not the l
2e4b0 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  ast.** root page
2e4c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2e4d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
2e4e0 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a  last root page .
2e4f0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2e500 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64  se file is moved
2e510 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66   into the slot f
2e520 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64  ormerly occupied
2e530 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e   by.** iTable an
2e540 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74  d that last slot
2e550 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
2e560 65 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72  ed by the last r
2e570 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  oot page.** is a
2e580 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
2e590 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20  list instead of 
2e5a0 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73  iTable.  In this
2e5b0 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f   say, all.** roo
2e5c0 74 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74  t pages are kept
2e5d0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2e5e0 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2e5f0 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a  e file, which.**
2e600 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
2e610 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20  r AUTOVACUUM to 
2e620 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69  work right.  *pi
2e630 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
2e640 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d  the .** page num
2e650 62 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f  ber that used to
2e660 20 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f   be the last roo
2e670 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
2e680 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  le before.** the
2e690 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61   move.  If no pa
2e6a0 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a  ge gets moved, *
2e6b0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
2e6c0 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74  o 0..** The last
2e6d0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65   root page is re
2e6e0 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33  corded in meta[3
2e6f0 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ] and the value 
2e700 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73  of.** meta[3] is
2e710 20 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73   updated by this
2e720 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73   procedure..*/.s
2e730 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44  tatic int btreeD
2e740 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
2e750 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
2e760 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
2e770 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2e780 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2e790 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2e7a0 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2e7b0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2e7c0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2e7d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
2e7e0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2e7f0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d  .    return pBt-
2e800 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2e810 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2e820 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2e830 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65  .  /* It is ille
2e840 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61  gal to drop a ta
2e850 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  ble if any curso
2e860 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  rs are open on t
2e870 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
2e880 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
2e890 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  e in auto-vacuum
2e8a0 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e   mode the backen
2e8b0 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20  d may.  ** need 
2e8c0 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20  to move another 
2e8d0 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c  root-page to fil
2e8e0 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20  l a gap left by 
2e8f0 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a  the deleted.  **
2e900 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61   root page. If a
2e910 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61  n open cursor wa
2e920 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67  s using this pag
2e930 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c  e a problem woul
2e940 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20  d .  ** occur.. 
2e950 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
2e960 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
2e970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2e980 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ED;.  }..  rc = 
2e990 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2e9a0 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
2e9b0 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30  Table, &pPage, 0
2e9c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2e9d0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
2e9e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2e9f0 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  rTable(p, iTable
2ea00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2ea10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ea20 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
2ea30 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69  n rc;.  }..  *pi
2ea40 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Moved = 0;..  if
2ea50 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69  ( iTable>1 ){.#i
2ea60 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2ea70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ea80 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2ea90 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  age);.    releas
2eaa0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65  ePage(pPage);.#e
2eab0 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d  lse.    if( pBt-
2eac0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2ead0 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f       Pgno maxRoo
2eae0 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  tPgno;.      rc 
2eaf0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2eb00 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78  tMeta(p, 4, &max
2eb10 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20  RootPgno);.     
2eb20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eb30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2eb40 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2eb50 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2eb60 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2eb70 20 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d      if( iTable==
2eb80 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20  maxRootPgno ){. 
2eb90 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2eba0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
2ebb0 70 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c  pped is the tabl
2ebc0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
2ebd0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2ebe0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
2ebf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
2ec00 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  put the root pag
2ec10 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  e on the free li
2ec20 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  st. .        */.
2ec30 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
2ec40 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2ec50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ec60 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2ec70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ec80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ec90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2eca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2ecb0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
2ecc0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
2ecd0 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68  opped does not h
2ece0 61 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  ave the largest 
2ecf0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
2ed00 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74    ** number in t
2ed10 68 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20  he database. So 
2ed20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68  move the page th
2ed30 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65  at does into the
2ed40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70   .        ** gap
2ed50 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
2ed60 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a  eted root-page..
2ed70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ed80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76     MemPage *pMov
2ed90 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  e;.        relea
2eda0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2edb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2edc0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2edd0 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
2ede0 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
2edf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ee00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ee10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ee20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee30 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
2ee40 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20  age(pBt, pMove, 
2ee50 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
2ee60 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20   0, iTable);.   
2ee70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ee80 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2ee90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2eeb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2eec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2eed0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2eee0 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
2eef0 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
2ef00 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2ef10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ef20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2ef30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2ef40 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
2ef50 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2ef60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ef70 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
2ef80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ef90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2efa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2efb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
2efc0 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74  iMoved = maxRoot
2efd0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Pgno;.      }.. 
2efe0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
2eff0 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61  new 'max-root-pa
2f000 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65  ge' value in the
2f010 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
2f020 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  . This.      ** 
2f030 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  is the old value
2f040 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20   less one, less 
2f050 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74  one more if that
2f060 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20   happens to.    
2f070 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70    ** be a root-p
2f080 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73  age number, less
2f090 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68   one again if th
2f0a0 61 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  at is the.      
2f0b0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ** PENDING_BYTE_
2f0c0 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  PAGE..      */. 
2f0d0 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
2f0e0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  --;.      if( ma
2f0f0 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49  xRootPgno==PENDI
2f100 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2f110 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78  ) ){.        max
2f120 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
2f130 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61    }.      if( ma
2f140 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41  xRootPgno==PTRMA
2f150 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61  P_PAGENO(pBt, ma
2f160 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20  xRootPgno) ){.  
2f170 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
2f180 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
2f190 20 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f     assert( maxRo
2f1a0 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  otPgno!=PENDING_
2f1b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2f1c0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
2f1d0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
2f1e0 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f  Meta(p, 4, maxRo
2f1f0 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c  otPgno);.    }el
2f200 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2f210 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2f220 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f230 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
2f240 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
2f250 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65      /* If sqlite
2f260 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20  3BtreeDropTable 
2f270 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61  was called on pa
2f280 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72  ge 1. */.    zer
2f290 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46  oPage(pPage, PTF
2f2a0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2f2b0 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
2f2c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
2f2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
2f2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2f2f0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
2f300 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
2f310 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
2f320 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2f330 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
2f340 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
2f350 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
2f360 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c  treeDropTable(p,
2f370 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64   iTable, piMoved
2f380 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
2f390 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2f3a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2f3b0 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d  * Read the meta-
2f3c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
2f3d0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
2f3e0 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  le.  Meta[0].** 
2f3f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2f400 20 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72   free pages curr
2f410 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74  ently in the dat
2f420 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a  abase.  Meta[1].
2f430 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b  ** through meta[
2f440 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c  15] are availabl
2f450 65 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67  e for use by hig
2f460 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74  her layers.  Met
2f470 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d  a[0].** is read-
2f480 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73  only, the others
2f490 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
2f4a0 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65  .** .** The sche
2f4b0 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73  ma layer numbers
2f4c0 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66   meta values dif
2f4d0 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68  ferently.  At th
2f4e0 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65  e schema.** laye
2f4f0 72 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f  r (and the SetCo
2f500 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f  okie and ReadCoo
2f510 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65  kie opcodes) the
2f520 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72   number of.** fr
2f530 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20  ee pages is not 
2f540 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f  visible.  So Coo
2f550 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61  kie[0] is the sa
2f560 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a  me as Meta[1]..*
2f570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2f580 65 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20  eeGetMeta(Btree 
2f590 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32  *p, int idx, u32
2f5a0 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61   *pMeta){.  DbPa
2f5b0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69  ge *pDbPage;.  i
2f5c0 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
2f5d0 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42  d char *pP1;.  B
2f5e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2f5f0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
2f600 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2f610 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
2f620 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  b;..  /* Reading
2f630 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
2f640 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
2f650 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
2f660 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
2f670 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
2f680 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
2f690 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
2f6a0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2f6b0 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
2f6c0 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
2f6d0 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
2f6e0 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
2f6f0 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
2f700 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
2f710 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
2f720 61 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c  ase by queryTabl
2f730 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b  eLock() and lock
2f740 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20  Table())..  */. 
2f750 20 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65   rc = queryTable
2f760 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f  Lock(p, 1, READ_
2f770 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
2f780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f790 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2f7a0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
2f7b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
2f7c0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2f7d0 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20  idx<=15 );.  rc 
2f7e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f7f0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31  t(pBt->pPager, 1
2f800 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
2f810 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
2f820 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2f830 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2f840 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75  ;.  }.  pP1 = (u
2f850 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
2f860 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2f870 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  ta(pDbPage);.  *
2f880 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
2f890 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
2f8a0 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  ]);.  sqlite3Pag
2f8b0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
2f8c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76  ;..  /* If autov
2f8d0 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62  acuumed is disab
2f8e0 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2f8f0 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79  d but we are try
2f900 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63  ing to .  ** acc
2f910 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75  ess an autovacuu
2f920 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  med database, th
2f930 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61  en make the data
2f940 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a  base readonly. .
2f950 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2f960 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f970 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20  UM.  if( idx==4 
2f980 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42  && *pMeta>0 ) pB
2f990 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
2f9a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72  .#endif..  /* Gr
2f9b0 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  ab the read-lock
2f9c0 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2f9d0 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
2f9e0 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2f9f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2fa00 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2fa10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fa20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72  Write meta-infor
2fa30 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f  mation back into
2fa40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2fa50 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65  Meta[0] is.** re
2fa60 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20  ad-only and may 
2fa70 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a  not be written..
2fa80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2fa90 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74  reeUpdateMeta(Bt
2faa0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
2fab0 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42   u32 iMeta){.  B
2fac0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2fad0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
2fae0 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69  d char *pP1;.  i
2faf0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
2fb00 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d   idx>=1 && idx<=
2fb10 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  15 );.  sqlite3B
2fb20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
2fb30 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
2fb40 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
2fb50 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s!=TRANS_WRITE )
2fb60 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
2fb70 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2fb80 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2fb90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2fba0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2fbb0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
2fbc0 3b 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d  ;.    pP1 = pBt-
2fbd0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a  >pPage1->aData;.
2fbe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fbf0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
2fc00 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2fc10 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2fc20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fc30 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33   put4byte(&pP1[3
2fc40 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74  6 + idx*4], iMet
2fc50 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
2fc60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2fc70 55 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64 78  UM.      if( idx
2fc80 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==7 ){.        a
2fc90 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
2fca0 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d  Vacuum || iMeta=
2fcb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
2fcc0 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c  sert( iMeta==0 |
2fcd0 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20  | iMeta==1 );.  
2fce0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
2fcf0 61 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20  acuum = iMeta;. 
2fd00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2fd10 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2fd20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2fd30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fd40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2fd50 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68   flag byte at th
2fd60 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2fd70 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65  he page that the
2fd80 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75   cursor.** is cu
2fd90 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2fda0 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
2fdb0 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74  te3BtreeFlags(Bt
2fdc0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2fdd0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61   /* TODO: What a
2fde0 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55  bout CURSOR_REQU
2fdf0 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50  IRESEEK state? P
2fe00 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20  robably need to 
2fe10 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72  call.  ** restor
2fe20 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
2fe30 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20  sition() here.. 
2fe40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2fe50 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 4f  Page;.  restoreO
2fe60 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2fe70 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50  tion(pCur);.  pP
2fe80 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2fe90 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
2fea0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2feb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2fec0 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75   pPage->pBt==pCu
2fed0 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75  r->pBt );.  retu
2fee0 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65  rn pPage ? pPage
2fef0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ff00 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d  drOffset] : 0;.}
2ff10 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2ff20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
2ff30 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65  ated with a BTre
2ff40 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2ff50 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
2ff60 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2ff70 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50  gging only..*/.P
2ff80 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72  ager *sqlite3Btr
2ff90 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70  eePager(Btree *p
2ffa0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
2ffb0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23  Bt->pPager;.}..#
2ffc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ffd0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2ffe0 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  CK./*.** Append 
2fff0 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  a message to the
30000 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
30010 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
30020 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e   void checkAppen
30030 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74  dMsg(.  Integrit
30040 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63  yCk *pCheck,.  c
30050 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f  har *zMsg1,.  co
30060 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
30070 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61  t,.  ....){.  va
30080 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
30090 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21   *zMsg2;.  if( !
300a0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20  pCheck->mxErr ) 
300b0 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b  return;.  pCheck
300c0 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68  ->mxErr--;.  pCh
300d0 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76  eck->nErr++;.  v
300e0 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
300f0 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20  mat);.  zMsg2 = 
30100 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
30110 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  0, zFormat, ap);
30120 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
30130 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20   if( zMsg1==0 ) 
30140 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66  zMsg1 = "";.  if
30150 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  ( pCheck->zErrMs
30160 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  g ){.    char *z
30170 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45  Old = pCheck->zE
30180 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63  rrMsg;.    pChec
30190 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  k->zErrMsg = 0;.
301a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
301b0 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45  ring(&pCheck->zE
301c0 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e  rrMsg, zOld, "\n
301d0 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  ", zMsg1, zMsg2,
301e0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
301f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c  sqlite3_free(zOl
30200 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
30210 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
30220 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  g(&pCheck->zErrM
30230 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32  sg, zMsg1, zMsg2
30240 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d  , (char*)0);.  }
30250 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
30260 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66  zMsg2);.}.#endif
30270 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
30280 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
30290 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
302a0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
302b0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64  Y_CHECK./*.** Ad
302c0 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72  d 1 to the refer
302d0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
302e0 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74  age iPage.  If t
302f0 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
30300 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  d.** reference t
30310 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20  o the page, add 
30320 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
30330 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72   to pCheck->zErr
30340 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  Msg..** Return 1
30350 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20   if there are 2 
30360 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e  ore more referen
30370 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
30380 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74  and 0 if.** if t
30390 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
303a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
303b0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e page..**.** Al
303c0 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  so check that th
303d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
303e0 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73   in bounds..*/.s
303f0 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52  tatic int checkR
30400 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  ef(IntegrityCk *
30410 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67  pCheck, int iPag
30420 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
30430 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
30440 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
30450 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
30460 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67  k->nPage || iPag
30470 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  e<0 ){.    check
30480 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
30490 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76  , zContext, "inv
304a0 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72  alid page number
304b0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
304c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
304d0 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e    if( pCheck->an
304e0 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b  Ref[iPage]==1 ){
304f0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
30500 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
30510 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72  text, "2nd refer
30520 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22  ence to page %d"
30530 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65  , iPage);.    re
30540 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
30550 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61  turn  (pCheck->a
30560 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31  nRef[iPage]++)>1
30570 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
30580 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30590 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  UUM./*.** Check 
305a0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69  that the entry i
305b0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
305c0 70 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c  p for page iChil
305d0 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61  d maps to .** pa
305e0 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e  ge iParent, poin
305f0 74 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65  ter type ptrType
30600 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64  . If not, append
30610 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
30620 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a  e.** to pCheck..
30630 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
30640 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e  heckPtrmap(.  In
30650 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
30660 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  k,   /* Integrit
30670 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20  y check context 
30680 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
30690 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
306a0 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72  hild page number
306b0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
306c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
306d0 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
306e0 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50   map type */.  P
306f0 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20  gno iParent,    
30700 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
30710 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  d pointer map pa
30720 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
30730 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
30740 74 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20  text         /* 
30750 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74  Context descript
30760 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72  ion (used for er
30770 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20  ror msg) */.){. 
30780 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50   int rc;.  u8 eP
30790 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e  trmapType;.  Pgn
307a0 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b  o iPtrmapParent;
307b0 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47  ..  rc = ptrmapG
307c0 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20  et(pCheck->pBt, 
307d0 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70  iChild, &ePtrmap
307e0 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61  Type, &iPtrmapPa
307f0 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
30800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30810 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
30820 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
30830 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65  t, "Failed to re
30840 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64  ad ptrmap key=%d
30850 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ", iChild);.    
30860 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
30870 66 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d  f( ePtrmapType!=
30880 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70  eType || iPtrmap
30890 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20  Parent!=iParent 
308a0 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
308b0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
308c0 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22  ontext, .      "
308d0 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72  Bad ptr map entr
308e0 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65  y key=%d expecte
308f0 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25  d=(%d,%d) got=(%
30900 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69  d,%d)", .      i
30910 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50  Child, eType, iP
30920 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79  arent, ePtrmapTy
30930 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e  pe, iPtrmapParen
30940 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  t);.  }.}.#endif
30950 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
30960 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
30970 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f  he freelist or o
30980 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
30990 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69  ge list..** Veri
309a0 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
309b0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
309c0 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f  he list is N..*/
309d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
309e0 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72  ckList(.  Integr
309f0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20  ityCk *pCheck,  
30a00 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
30a10 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  cking context */
30a20 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73  .  int isFreeLis
30a30 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  t,       /* True
30a40 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e   for a freelist.
30a50 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72    False for over
30a60 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a  flow page list *
30a70 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
30a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30a90 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  e number for fir
30aa0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  st page in the l
30ab0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  ist */.  int N, 
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30ad0 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65  * Expected numbe
30ae0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
30af0 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  e list */.  char
30b00 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20   *zContext      
30b10 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
30b20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
30b30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
30b40 20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20   int expected = 
30b50 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  N;.  int iFirst 
30b60 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65  = iPage;.  while
30b70 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68  ( N-- > 0 && pCh
30b80 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20  eck->mxErr ){.  
30b90 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50    DbPage *pOvflP
30ba0 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  age;.    unsigne
30bb0 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74  d char *pOvflDat
30bc0 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  a;.    if( iPage
30bd0 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  <1 ){.      chec
30be0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
30bf0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
30c00 20 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20        "%d of %d 
30c10 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72  pages missing fr
30c20 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  om overflow list
30c30 20 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22   starting at %d"
30c40 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c  ,.          N+1,
30c50 20 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73   expected, iFirs
30c60 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
30c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
30c80 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
30c90 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
30ca0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
30cb0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
30cc0 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72  t(pCheck->pPager
30cd0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
30ce0 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20  pOvflPage) ){.  
30cf0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30d00 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30d10 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ext, "failed to 
30d20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50  get page %d", iP
30d30 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  age);.      brea
30d40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76  k;.    }.    pOv
30d50 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e  flData = (unsign
30d60 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
30d70 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f  3PagerGetData(pO
30d80 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66  vflPage);.    if
30d90 28 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a  ( isFreeList ){.
30da0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65        int n = ge
30db0 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
30dc0 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  a[4]);.#ifndef S
30dd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
30de0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
30df0 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74  pCheck->pBt->aut
30e00 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30e10 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
30e20 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54  Check, iPage, PT
30e30 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
30e40 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
30e50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
30e60 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e    if( n>pCheck->
30e70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
30e80 34 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63  4-8 ){.        c
30e90 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
30ea0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
30eb0 20 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65             "free
30ec0 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20  list leaf count 
30ed0 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20  too big on page 
30ee0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30ef0 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20       N--;.      
30f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
30f10 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
30f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  ){.          Pgn
30f30 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65  o iFreePage = ge
30f40 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74  t4byte(&pOvflDat
30f50 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64  a[8+i*4]);.#ifnd
30f60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
30f70 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
30f80 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
30f90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
30fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
30fb0 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
30fc0 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54  k, iFreePage, PT
30fd0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
30fe0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
30ff0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
31000 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52            checkR
31010 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65  ef(pCheck, iFree
31020 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
31030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31040 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20     N -= n;.     
31050 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
31060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31070 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65  OVACUUM.    else
31080 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
31090 69 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70  is database supp
310a0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
310b0 20 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f   and iPage is no
310c0 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20  t the last.     
310d0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
310e0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20   overflow list, 
310f0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  check that the p
31100 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
31110 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
31120 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65  e following page
31130 20 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a   matches iPage..
31140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31150 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
31160 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e  autoVacuum && N>
31170 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  0 ){.        i =
31180 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
31190 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ata);.        ch
311a0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
311b0 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  , i, PTRMAP_OVER
311c0 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW2, iPage, zC
311d0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
311e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
311f0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
31200 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20  te(pOvflData);. 
31210 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
31220 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b  nref(pOvflPage);
31230 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
31240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
31250 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
31260 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31270 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
31280 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61  HECK./*.** Do va
31290 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65  rious sanity che
312a0 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  cks on a single 
312b0 70 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20  page of a tree. 
312c0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74   Return.** the t
312d0 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74  ree depth.  Root
312e0 20 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e   pages return 0.
312f0 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f    Parents of roo
31300 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72  t pages.** retur
31310 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  n 1, and so fort
31320 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20  h..** .** These 
31330 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a  checks are done:
31340 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20  .**.**      1.  
31350 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63  Make sure that c
31360 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f  ells and freeblo
31370 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c  cks do not overl
31380 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62  ap.**          b
31390 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f  ut combine to co
313a0 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74  mpletely cover t
313b0 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20  he page..**  NO 
313c0 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63   2.  Make sure c
313d0 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20  ell keys are in 
313e0 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33  order..**  NO  3
313f0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  .  Make sure no 
31400 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e  key is less than
31410 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f   or equal to zLo
31420 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f  werBound..**  NO
31430 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    4.  Make sure 
31440 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65  no key is greate
31450 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
31460 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a  to zUpperBound..
31470 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63  **      5.  Chec
31480 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
31490 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
314a0 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52  s..**      6.  R
314b0 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20  ecursively call 
314c0 63 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e  checkTreePage on
314d0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a   all children..*
314e0 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66  *      7.  Verif
314f0 79 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68  y that the depth
31500 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
31510 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a   is the same..**
31520 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73        8.  Make s
31530 75 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73  ure this page is
31540 20 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75   at least 33% fu
31550 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  ll or else it is
31560 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65  .**          the
31570 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
31580 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
31590 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a   checkTreePage(.
315a0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
315b0 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65  Check,  /* Conte
315c0 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74  xt for the sanit
315d0 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  y check */.  int
315e0 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20   iPage,         
315f0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31600 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
31610 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50   check */.  MemP
31620 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
31630 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
31640 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72   */.  char *zPar
31650 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50  entContext  /* P
31660 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f  arent context */
31670 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
31680 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72  Page;.  int i, r
31690 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67  c, depth, d2, pg
316a0 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68  no, cnt;.  int h
316b0 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20  dr, cellStart;. 
316c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38   int nCell;.  u8
316d0 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72   *data;.  BtShar
316e0 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75  ed *pBt;.  int u
316f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61  sableSize;.  cha
31700 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b  r zContext[100];
31710 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20  .  char *hit;.. 
31720 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31730 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
31740 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50  t), zContext, "P
31750 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65  age %d: ", iPage
31760 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
31770 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
31780 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d  sts.  */.  pBt =
31790 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20   pCheck->pBt;.  
317a0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
317b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
317c0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
317d0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63  eturn 0;.  if( c
317e0 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
317f0 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f  iPage, zParentCo
31800 6e 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20  ntext) ) return 
31810 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73  0;.  if( (rc = s
31820 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
31830 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50  ge(pBt, (Pgno)iP
31840 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
31850 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  !=0 ){.    check
31860 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31870 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
31880 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65     "unable to ge
31890 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f  t the page. erro
318a0 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b  r code=%d", rc);
318b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
318c0 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73   }.  if( (rc = s
318d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
318e0 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65  age(pPage, pPare
318f0 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt))!=0 ){.    c
31900 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31910 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31930 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65      "sqlite3Btre
31940 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75  eInitPage() retu
31950 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25  rns error code %
31960 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c  d", rc);.    rel
31970 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31980 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
31990 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f   }..  /* Check o
319a0 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  ut all the cells
319b0 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d  ..  */.  depth =
319c0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
319d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  <pPage->nCell &&
319e0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20   pCheck->mxErr; 
319f0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
31a00 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b  ell;.    int sz;
31a10 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
31a20 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  fo;..    /* Chec
31a30 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c  k payload overfl
31a40 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a  ow pages.    */.
31a50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31a60 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
31a70 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
31a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f  .             "O
31a90 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63  n tree page %d c
31aa0 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65  ell %d: ", iPage
31ab0 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20  , i);.    pCell 
31ac0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31ad0 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ,i);.    sqlite3
31ae0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
31af0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
31b00 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d  &info);.    sz =
31b10 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20   info.nData;.   
31b20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
31b30 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f  Key ) sz += info
31b40 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72  .nKey;.    asser
31b50 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79  t( sz==info.nPay
31b60 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20  load );.    if( 
31b70 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  sz>info.nLocal )
31b80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
31b90 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e  e = (sz - info.n
31ba0 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69  Local + usableSi
31bb0 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53  ze - 5)/(usableS
31bc0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  ize - 4);.      
31bd0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
31be0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
31bf0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
31c00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31c10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31c20 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
31c30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31c40 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
31c50 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76  p(pCheck, pgnoOv
31c60 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
31c70 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW1, iPage, zCo
31c80 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
31c90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65  #endif.      che
31ca0 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30  ckList(pCheck, 0
31cb0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67  , pgnoOvfl, nPag
31cc0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31cd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
31ce0 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74  k sanity of left
31cf0 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20   child page..   
31d00 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
31d10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31d20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31d30 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  e(pCell);.#ifnde
31d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31d50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
31d60 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
31d70 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
31d80 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31d90 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
31da0 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f  TREE, iPage, zCo
31db0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
31dc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20  #endif.      d2 
31dd0 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28  = checkTreePage(
31de0 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67  pCheck,pgno,pPag
31df0 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  e,zContext);.   
31e00 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32     if( i>0 && d2
31e10 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  !=depth ){.     
31e20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31e30 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31e40 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20  xt, "Child page 
31e50 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b  depth differs");
31e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
31e70 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d  epth = d2;.    }
31e80 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
31e90 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
31ea0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
31eb0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
31ec0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
31ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
31ee0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
31ef0 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
31f00 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
31f10 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61            "On pa
31f20 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63  ge %d at right c
31f30 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  hild: ", iPage);
31f40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31f50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31f60 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
31f70 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
31f80 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
31f90 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
31fa0 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
31fb0 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
31fc0 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
31fd0 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c  ge(pCheck, pgno,
31fe0 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   pPage, zContext
31ff0 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68  );.  }. .  /* Ch
32000 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65  eck for complete
32010 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65   coverage of the
32020 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74   page.  */.  dat
32030 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
32040 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
32050 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69  >hdrOffset;.  hi
32060 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
32070 63 5a 65 72 6f 28 20 75 73 61 62 6c 65 53 69 7a  cZero( usableSiz
32080 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29  e );.  if( hit )
32090 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  {.    memset(hit
320a0 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64  , 1, get2byte(&d
320b0 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20  ata[hdr+5]));.  
320c0 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
320d0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
320e0 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20  ;.    cellStart 
320f0 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
32100 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
32110 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
32120 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
32130 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
32140 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b  &data[cellStart+
32150 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i*2]);.      int
32160 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
32170 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
32180 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  [pc]);.      int
32190 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   j;.      if( (p
321a0 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  c+size-1)>=usabl
321b0 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b  eSize || pc<0 ){
321c0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
321d0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
321e0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
321f0 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
32200 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
32210 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
32220 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
32230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
32240 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e  (j=pc+size-1; j>
32250 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  =pc; j--) hit[j]
32260 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
32270 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c  }.    for(cnt=0,
32280 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74   i=get2byte(&dat
32290 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26  a[hdr+1]); i>0 &
322a0 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26  & i<usableSize &
322b0 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20  & cnt<10000; .  
322c0 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b           cnt++){
322d0 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
322e0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
322f0 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e  [i+2]);.      in
32300 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
32310 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c  i+size-1)>=usabl
32320 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a  eSize || i<0 ){.
32330 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
32340 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
32350 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,  .            
32360 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65  "Corruption dete
32370 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20  cted in cell %d 
32380 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50  on page %d",i,iP
32390 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  age,0);.      }e
323a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
323b0 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  (j=i+size-1; j>=
323c0 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b  i; j--) hit[j]++
323d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
323e0 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  i = get2byte(&da
323f0 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ta[i]);.    }.  
32400 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69    for(i=cnt=0; i
32410 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b  <usableSize; i++
32420 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74  ){.      if( hit
32430 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
32440 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d    cnt++;.      }
32450 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e  else if( hit[i]>
32460 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  1 ){.        che
32470 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32480 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ck, 0,.         
32490 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20   "Multiple uses 
324a0 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70  for byte %d of p
324b0 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67  age %d", i, iPag
324c0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
324d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
324e0 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61  .    if( cnt!=da
324f0 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20  ta[hdr+7] ){.   
32500 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32510 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
32520 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e          "Fragmen
32530 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20  ted space is %d 
32540 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73  byte reported as
32550 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c   %d on page %d",
32560 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20  .          cnt, 
32570 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61  data[hdr+7], iPa
32580 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
32590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69   sqlite3_free(hi
325a0 74 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61  t);..  releasePa
325b0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ge(pPage);.  ret
325c0 75 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23  urn depth+1;.}.#
325d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
325e0 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
325f0 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
32600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
32610 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
32620 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
32630 64 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  does a complete 
32640 63 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76  check of the giv
32650 65 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20  en BTree file.  
32660 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e  aRoot[] is.** an
32670 20 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20   array of pages 
32680 6e 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63  numbers were eac
32690 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  h page number is
326a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
326b0 66 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e  f.** a table.  n
326c0 52 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62  Root is the numb
326d0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
326e0 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   aRoot..**.** If
326f0 20 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63   everything chec
32700 6b 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75  ks out, this rou
32710 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
32720 4c 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  L.  If something
32730 20 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e   is.** amiss, an
32740 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
32750 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  s written into m
32760 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
32770 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20  rom malloc().** 
32780 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
32790 20 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73   that error mess
327a0 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
327b0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
327c0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73  nction.** is res
327d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
327e0 65 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d  eing the error m
327f0 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69  essage when it i
32800 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20  s done..*/.char 
32810 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
32820 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42  egrityCheck(.  B
32830 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20  tree *p,     /* 
32840 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  The btree to be 
32850 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
32860 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e   *aRoot,   /* An
32870 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70   array of root p
32880 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  ages numbers for
32890 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65   individual tree
328a0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  s */.  int nRoot
328b0 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
328c0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
328d0 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ot[] */.  int mx
328e0 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20  Err,    /* Stop 
328f0 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73  reporting errors
32900 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79   after this many
32910 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72   */.  int *pnErr
32920 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d      /* Write num
32930 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
32940 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  en to this varia
32950 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
32960 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20  i;.  int nRef;. 
32970 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68   IntegrityCk sCh
32980 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  eck;.  BtShared 
32990 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
329a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
329b0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
329c0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65  b = p->db;.  nRe
329d0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
329e0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
329f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63  ager);.  if( loc
32a00 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
32a10 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  p)!=SQLITE_OK ){
32a20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
32a30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
32a40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72  eturn sqlite3Str
32a50 44 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61  Dup("Unable to a
32a60 63 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f  cquire a read lo
32a70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32a80 73 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65  se");.  }.  sChe
32a90 63 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  ck.pBt = pBt;.  
32aa0 73 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20  sCheck.pPager = 
32ab0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pBt->pPager;.  s
32ac0 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71  Check.nPage = sq
32ad0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
32ae0 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
32af0 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
32b00 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
32b10 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
32b20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66   *pnErr = 0;.#if
32b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32b40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
32b50 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30  ( pBt->nTrunc!=0
32b60 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e   ){.    sCheck.n
32b70 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Page = pBt->nTru
32b80 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  nc;.  }.#endif. 
32b90 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67   if( sCheck.nPag
32ba0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  e==0 ){.    unlo
32bb0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
32bc0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
32bd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
32be0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
32bf0 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  }.  sCheck.anRef
32c00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
32c10 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65  c( (sCheck.nPage
32c20 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
32c30 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20  k.anRef[0]) );. 
32c40 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52   if( !sCheck.anR
32c50 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  ef ){.    unlock
32c60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
32c70 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d  t);.    *pnErr =
32c80 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
32c90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32ca0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32cb0 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22  MPrintf(p->db, "
32cc0 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63  Unable to malloc
32cd0 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20   %d bytes", .   
32ce0 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61       (sCheck.nPa
32cf0 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68  ge+1)*sizeof(sCh
32d00 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a  eck.anRef[0]));.
32d10 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
32d20 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20  <=sCheck.nPage; 
32d30 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52  i++){ sCheck.anR
32d40 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69  ef[i] = 0; }.  i
32d50 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
32d60 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28  PAGE(pBt);.  if(
32d70 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
32d80 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61   ){.    sCheck.a
32d90 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d  nRef[i] = 1;.  }
32da0 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73  .  sCheck.zErrMs
32db0 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65  g = 0;..  /* Che
32dc0 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
32dd0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
32de0 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73  .  */.  checkLis
32df0 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65  t(&sCheck, 1, ge
32e00 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
32e10 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c  ge1->aData[32]),
32e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
32e30 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
32e40 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20  e1->aData[36]), 
32e50 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20  "Main freelist: 
32e60 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ");..  /* Check 
32e70 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a  all the tables..
32e80 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
32e90 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63  i<nRoot && sChec
32ea0 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  k.mxErr; i++){. 
32eb0 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d     if( aRoot[i]=
32ec0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  =0 ) continue;.#
32ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32ee0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32ef0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
32f00 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69  acuum && aRoot[i
32f10 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ]>1 ){.      che
32f20 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b  ckPtrmap(&sCheck
32f30 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d  , aRoot[i], PTRM
32f40 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
32f50 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
32f60 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
32f70 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ge(&sCheck, aRoo
32f80 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f  t[i], 0, "List o
32f90 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29  f tree roots: ")
32fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
32fb0 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65   sure every page
32fc0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
32fd0 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a  referenced.  */.
32fe0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43    for(i=1; i<=sC
32ff0 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43  heck.nPage && sC
33000 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29  heck.mxErr; i++)
33010 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
33020 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33030 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
33040 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  nRef[i]==0 ){.  
33050 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
33060 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
33070 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72  Page %d is never
33080 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20   used", i);.    
33090 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49  }.#else.    /* I
330a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
330b0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
330c0 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e  uum, make sure n
330d0 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e  o tables contain
330e0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
330f0 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61  es to pointer-ma
33100 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a  p pages..    */.
33110 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
33120 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20  nRef[i]==0 && . 
33130 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
33140 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20  GENO(pBt, i)!=i 
33150 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  || !pBt->autoVac
33160 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
33170 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
33180 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25  heck, 0, "Page %
33190 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22  d is never used"
331a0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
331b0 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  if( sCheck.anRef
331c0 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20  [i]!=0 && .     
331d0 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f    (PTRMAP_PAGENO
331e0 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70  (pBt, i)==i && p
331f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
33200 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
33210 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
33220 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70   0, "Pointer map
33230 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65   page %d is refe
33240 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20  renced", i);.   
33250 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
33260 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
33270 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20  is analysis did 
33280 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e  not leave any un
33290 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f  ref() pages.  */
332a0 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
332b0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69  Unused(pBt);.  i
332c0 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74  f( nRef != sqlit
332d0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
332e0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
332f0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
33300 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a  sg(&sCheck, 0, .
33310 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69        "Outstandi
33320 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f  ng page count go
33330 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  es from %d to %d
33340 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61   during this ana
33350 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52  lysis",.      nR
33360 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ef, sqlite3Pager
33370 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
33380 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d  ager).    );.  }
33390 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70  ..  /* Clean  up
333a0 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f   and report erro
333b0 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  rs..  */.  sqlit
333c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
333d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
333e0 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20  sCheck.anRef);. 
333f0 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b   *pnErr = sCheck
33400 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20  .nErr;.  return 
33410 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a  sCheck.zErrMsg;.
33420 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
33430 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
33440 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a  Y_CHECK */../*.*
33450 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
33460 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
33470 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
33480 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
33490 2a 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65  * The pager file
334a0 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
334b0 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
334c0 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
334d0 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
334e0 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
334f0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
33500 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
33510 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
33520 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
33530 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
33540 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
33550 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
33560 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
33570 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
33580 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
33590 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
335a0 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
335b0 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
335c0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
335d0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ile..**.** The p
335e0 61 67 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e  ager directory n
335f0 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
33600 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
33610 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
33620 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
33630 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
33640 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
33650 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
33660 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
33670 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65  GetDirname(Btree
33680 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
33690 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
336a0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
336b0 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
336c0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
336d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
336e0 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
336f0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
33700 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74  ile for this dat
33710 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72  abase. The retur
33720 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  n.** value of th
33730 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
33740 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73  e same regardles
33750 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
33760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
33770 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
33780 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  d or not..**.** 
33790 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61  The pager journa
337a0 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
337b0 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20  variant as long 
337c0 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a  as the pager is.
337d0 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73  ** open so it is
337e0 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20   safe to access 
337f0 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68  without the BtSh
33800 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63  ared mutex..*/.c
33810 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33820 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
33830 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  lname(Btree *p){
33840 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
33850 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
33860 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
33870 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
33880 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
33890 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
338a0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
338b0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63  /*.** Copy the c
338c0 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
338d0 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20  of pBtFrom into 
338e0 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61  pBtTo.  A transa
338f0 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65  ction.** must be
33900 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68   active for both
33910 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
33920 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70  e size of file p
33930 42 74 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65  BtFrom may be re
33940 64 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70  duced by this op
33950 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61  eration..** If a
33960 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
33970 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ng, the transact
33980 69 6f 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69  ion on pBtFrom i
33990 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
339a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
339b0 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65  eeCopyFile(Btree
339c0 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46   *pTo, Btree *pF
339d0 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rom){.  int rc =
339e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
339f0 6e 6f 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f  no i, nPage, nTo
33a00 50 61 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20  Page, iSkip;..  
33a10 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
33a20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
33a30 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
33a40 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
33a50 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
33a60 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e  >db;.  pBtFrom->
33a70 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a  db = pFrom->db;.
33a80 20 20 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69    ..  if( pTo->i
33a90 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
33aa0 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
33ab0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
33ac0 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
33ad0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
33ae0 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
33af0 70 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e  pCursor ) return
33b00 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
33b10 6e 54 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65  nToPage = sqlite
33b20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
33b30 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
33b40 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
33b50 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
33b60 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
33b70 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
33b80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33b90 74 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  tTo);.  for(i=1;
33ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33bb0 26 20 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29  & i<=nPage; i++)
33bc0 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33bd0 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33be0 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33bf0 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33c00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33c10 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 2c  From->pPager, i,
33c20 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
33c30 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
33c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33c50 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 70  PagerOverwrite(p
33c60 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c  BtTo->pPager, i,
33c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33c80 44 61 74 61 28 70 44 62 50 61 67 65 29 29 3b 0a  Data(pDbPage));.
33c90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33ca0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33cb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33cc0 20 66 69 6c 65 20 69 73 20 73 68 72 69 6e 6b 69   file is shrinki
33cd0 6e 67 2c 20 6a 6f 75 72 6e 61 6c 20 74 68 65 20  ng, journal the 
33ce0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 62  pages that are b
33cf0 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 0a 20  eing truncated. 
33d00 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 79   ** so that they
33d10 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
33d20 61 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  ack if the commi
33d30 74 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20 20  t fails..  */.  
33d40 66 6f 72 28 69 3d 6e 50 61 67 65 2b 31 3b 20 72  for(i=nPage+1; r
33d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33d60 69 3c 3d 6e 54 6f 50 61 67 65 3b 20 69 2b 2b 29  i<=nToPage; i++)
33d70 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 44  {.    DbPage *pD
33d80 62 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 69  bPage;.    if( i
33d90 3d 3d 69 53 6b 69 70 20 29 20 63 6f 6e 74 69 6e  ==iSkip ) contin
33da0 75 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ue;.    rc = sql
33db0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
33dc0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
33dd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33de0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
33df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33e00 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
33e10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
33e20 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
33e30 50 61 67 65 29 3b 0a 20 20 20 20 2f 2a 20 59 65  Page);.    /* Ye
33e40 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
33e50 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
33e60 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
33e70 74 65 72 20 57 72 69 74 65 28 29 2e 20 20 42 75  ter Write().  Bu
33e80 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33e90 20 62 65 63 61 75 73 65 20 74 68 65 20 6e 61 6d   because the nam
33ea0 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72 6f 63  es of those proc
33eb0 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20 65 78  edures do not ex
33ec0 61 63 74 6c 79 20 0a 20 20 20 20 2a 2a 20 72 65  actly .    ** re
33ed0 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68 65  present what the
33ee0 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72  y do.  Write() r
33ef0 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74  eally means "put
33f00 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74 68   this page in th
33f10 65 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  e.    ** rollbac
33f20 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
33f30 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
33f40 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
33f50 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
33f60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33f70 20 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44   file later."  D
33f80 6f 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65  ontWrite() undoe
33f90 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
33fa0 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 61 74  t of.    ** that
33fb0 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68   and prevents th
33fc0 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  e page from bein
33fd0 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  g written to the
33fe0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 0a   database.  The.
33ff0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
34000 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
34010 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
34020 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
34030 69 73 20 74 68 65 20 77 68 6f 6c 65 0a 20 20 20  is the whole.   
34040 20 2a 2a 20 70 6f 69 6e 74 20 6f 66 20 74 68 69   ** point of thi
34050 73 20 6c 6f 6f 70 3a 20 74 6f 20 70 75 74 20 70  s loop: to put p
34060 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
34070 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  back journal. */
34080 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
34090 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
340a0 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 26  .  }.  if( !rc &
340b0 26 20 6e 50 61 67 65 3c 6e 54 6f 50 61 67 65 20  & nPage<nToPage 
340c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
340d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
340e0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
340f0 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  nPage);.  }..  i
34100 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
34110 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
34120 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  k(pTo);.  }.  re
34130 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
34140 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
34150 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
34160 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
34170 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
34180 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34190 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  To);.  sqlite3Bt
341a0 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b  reeEnter(pFrom);
341b0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70  .  rc = btreeCop
341c0 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d  yFile(pTo, pFrom
341d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
341e0 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20  eLeave(pFrom);. 
341f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
34200 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72  ve(pTo);.  retur
34210 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
34220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
34230 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
34240 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
34250 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
34260 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
34270 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
34280 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  sInTrans(Btree *
34290 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  p){.  assert( p=
342a0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
342b0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
342c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
342d0 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
342e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
342f0 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  E));.}../*.** Re
34300 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
34310 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
34320 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
34330 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
34340 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28  e3BtreeIsInStmt(
34350 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
34360 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
34370 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
34380 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
34390 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e  Bt && p->pBt->in
343a0 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
343b0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
343c0 69 66 20 61 20 72 65 61 64 20 28 6f 72 20 77 72  if a read (or wr
343d0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
343e0 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
343f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
34400 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72  sInReadTrans(Btr
34410 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
34420 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34430 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
34440 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x) );.  return (
34450 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
34460 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a  !=TRANS_NONE));.
34470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
34480 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
34490 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c   pointer to a bl
344a0 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
344b0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
344c0 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d  a single shared-
344d0 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72  btree. The memor
344e0 79 20 69 73 20 75 73 65 64 20 62 79 20 63 6c 69  y is used by cli
344f0 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73  ent code for its
34500 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73   own.** purposes
34510 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74   (for example, t
34520 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c  o store a high-l
34530 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f  evel schema asso
34540 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
34550 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
34560 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61 79  ). The btree lay
34570 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72  er manages refer
34580 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73  ence counting is
34590 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sues..**.** The 
345a0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
345b0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73  is called on a s
345c0 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79  hared-btree, nBy
345d0 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  tes bytes of mem
345e0 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63  ory.** are alloc
345f0 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e  ated, zeroed, an
34600 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  d returned to th
34610 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61  e caller. For ea
34620 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a  ch subsequent .*
34630 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65  * call the nByte
34640 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  s parameter is i
34650 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69  gnored and a poi
34660 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65  nter to the same
34670 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f   blob.** of memo
34680 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  ry returned. .**
34690 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20  .** Just before 
346a0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
346b0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20   is closed, the 
346c0 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20  function passed 
346d0 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65  as the .** xFree
346e0 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
346f0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
34700 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73  tion was made is
34710 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
34720 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f  .** blob of allo
34730 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68  cated memory. Th
34740 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
34750 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69  ld not call sqli
34760 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e  te3_free().** on
34770 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65   the memory, the
34780 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65   btree layer doe
34790 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  s that..*/.void 
347a0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68  *sqlite3BtreeSch
347b0 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ema(Btree *p, in
347c0 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a  t nBytes, void(*
347d0 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b  xFree)(void *)){
347e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
347f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
34800 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34810 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  );.  if( !pBt->p
34820 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42  Schema ){.    pB
34830 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  t->pSchema = sql
34840 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e  ite3MallocZero(n
34850 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d  Bytes);.    pBt-
34860 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78  >xFreeSchema = x
34870 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Free;.  }.  sqli
34880 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
34890 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  ;.  return pBt->
348a0 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  pSchema;.}../*.*
348b0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
348c0 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66   another user of
348d0 20 74 68 65 20 73 61 6d 65 20 73 68 61 72 65 64   the same shared
348e0 20 62 74 72 65 65 20 61 73 20 74 68 65 20 61 72   btree as the ar
348f0 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65  gument.** handle
34900 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
34910 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
34920 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
34930 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
34940 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f  te3BtreeSchemaLo
34950 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  cked(Btree *p){.
34960 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
34970 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
34980 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
34990 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
349a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
349b0 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61 62    rc = (queryTab
349c0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
349d0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
349e0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  )!=SQLITE_OK);. 
349f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
34a00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
34a10 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
34a20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
34a30 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f  ED_CACHE./*.** O
34a40 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
34a50 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  the table whose 
34a60 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61  root page is iTa
34a70 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20  b.  The.** lock 
34a80 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  is a write lock 
34a90 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69  if isWritelock i
34aa0 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64  s true or a read
34ab0 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69   lock.** if it i
34ac0 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
34ad0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
34ae0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
34af0 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57  int iTab, u8 isW
34b00 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  riteLock){.  int
34b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34b20 0a 20 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d  .  u8 lockType =
34b30 20 28 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52   (isWriteLock?WR
34b40 49 54 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f  ITE_LOCK:READ_LO
34b50 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  CK);.  sqlite3Bt
34b60 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
34b70 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
34b80 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  ck(p, iTab, lock
34b90 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Type);.  if( rc=
34ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34bb0 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
34bc0 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
34bd0 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
34be0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
34bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34c00 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
34c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
34c20 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLOB./*.** Argum
34c30 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65  ent pCsr must be
34c40 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
34c50 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20   for writing on 
34c60 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61  an .** INTKEY ta
34c70 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ble currently po
34c80 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
34c90 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a  d table entry. .
34ca0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34cb0 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61   modifies the da
34cc0 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ta stored as par
34cd0 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e  t of that entry.
34ce0 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74  .** Only the dat
34cf0 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e  a content may on
34d00 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ly be modified, 
34d10 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
34d20 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  le.** to change 
34d30 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
34d40 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a  e data stored..*
34d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
34d60 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73  eePutData(BtCurs
34d70 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66  or *pCsr, u32 of
34d80 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
34d90 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72  oid *z){.  asser
34da0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
34db0 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61  tex(pCsr) );.  a
34dc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34dd0 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e  utex_held(pCsr->
34de0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
34df0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
34e00 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Csr->isIncrblobH
34e10 61 6e 64 6c 65 29 3b 0a 20 20 69 66 28 20 70 43  andle);.  if( pC
34e20 73 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  sr->eState>=CURS
34e30 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
34e40 7b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e  {.    if( pCsr->
34e50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
34e60 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65  AULT ){.      re
34e70 74 75 72 6e 20 70 43 73 72 2d 3e 73 6b 69 70 3b  turn pCsr->skip;
34e80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34ea0 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  ABORT;.    }.  }
34eb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d  ..  /* Check som
34ec0 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  e preconditions:
34ed0 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65   .  **   (a) the
34ee0 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
34ef0 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a  for writing,.  *
34f00 2a 20 20 20 28 62 29 20 74 68 65 72 65 20 69 73  *   (b) there is
34f10 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   no read-lock on
34f20 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
34f30 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20   modified and.  
34f40 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63 75 72  **   (c) the cur
34f50 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  sor points at a 
34f60 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20  valid row of an 
34f70 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20  intKey table..  
34f80 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e  */.  if( !pCsr->
34f90 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
34fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
34fb0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ONLY;.  }.  asse
34fc0 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e  rt( !pCsr->pBt->
34fd0 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20  readOnly .      
34fe0 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74      && pCsr->pBt
34ff0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
35000 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
35010 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
35020 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65  ocks(pCsr->pBtre
35030 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCsr->pgnoRoo
35040 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20  t, pCsr) ){.    
35050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
35060 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
35070 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
35080 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
35090 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
350a0 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
350b0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21  SOR_INVALID || !
350c0 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCsr->pPage->int
350d0 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
350e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
350f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63    }..  return ac
35100 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72  cessPayload(pCsr
35110 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
35120 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
35130 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20  z, 0, 1);.}../* 
35140 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f  .** Set a flag o
35150 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f  n this cursor to
35160 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74   cache the locat
35170 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72  ions of pages fr
35180 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66  om the .** overf
35190 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65  low list for the
351a0 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68   current row. Th
351b0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63 75  is is used by cu
351c0 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
351d0 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  for incremental 
351e0 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a  blob IO only..**
351f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
35200 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e  n sets a flag on
35210 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ly. The actual p
35220 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63  age location cac
35230 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e  he.** (stored in
35240 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
35250 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61  low[]) is alloca
35260 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79 20  ted and used by 
35270 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
35280 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65  ssPayload() (the
35290 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   worker function
352a0 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   for sqlite3Btre
352b0 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73  eData() and.** s
352c0 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
352d0 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ta())..*/.void s
352e0 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68 65  qlite3BtreeCache
352f0 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f  Overflow(BtCurso
35300 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
35310 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
35320 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
35330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35340 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
35350 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
35360 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
35370 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f  !pCur->isIncrblo
35380 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65  bHandle);.  asse
35390 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
353a0 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73  low);.  pCur->is
353b0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d  IncrblobHandle =
353c0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a            1;.}.#endif.